clone模式在平衡排序二叉树实现中的应用

2016-01-29 12:15 5 1 收藏

clone模式在平衡排序二叉树实现中的应用,clone模式在平衡排序二叉树实现中的应用

【 tulaoshi.com - C语言心得技巧 】

clone模式在平衡排序二叉树实现中的应用
作者:wujinglong

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

下载本文示例源代码

clone模式既prototype模式,是构造模式中的一种。其意图为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

关键代码如下:

virtual product * prototype::clone(){return new prototype(this->datas);}virtual product * concreteprototype_1::clone(){//return copy of selfreturn new concreteprototype_1(this->datas);}virtual product * concreteprototype_2::clone(){//return copy of selfreturn new concreteprototype_2(this->datas);}
有Java经验的会在Object中看到clone方法。

clone模式有两个问题:
(一)内存泄漏,在clone函数中新建了一个对象,如果没有在外部接收它,它就不会自己释放自己。
(二)clone一个组件,如组合模式(composite)产生的抽象对象。
第一个问题的解决方案为智能指针,有很多文献介绍过这类问题。
这里讨论如何用clone模式clone一个组件。
virtual component * component::clone(){component * pnew = new component(this->datas);for(all components of this object (this->o)){if(this->o != NULL)//复制本组件中的每一个元件pnew->o = this->o->clone();}return pnew;}
譬如一个链表结点类:
class Node{private:DataType datas;Node *   next;public:virtual Node* clone(){Node* pnew=new Node(this->datas);if(this->next != NULL)pnew->next = this->next->clone();return pnew;}//other codes}
这样复制一个结点与复制一个链表统一起来了,不是很好吗?大功告成。
但是不要高兴太早,现在有一个链表,是循环链表(单向),试用上面方法复制它。 你将会进入死循环,最后内存耗竭而报错.
最后一个结点的下一个为头结点,应该将其后向指针指向新建的头结点,而不是再生成一个结点。
即将上面代码改为:
...for(all components of this object (this->o)){if(this->o ==NULL){pnew->o=NULL;}else if(this->o 未被复制){//复制本组件中的每一个元件pnew->o = this->o->clone();}else{pnew->o = this->o 的复制品;}return  pnew;}
为判断组件 o 是否已经被复制应该在组件 o 中加一个标志cloned,cloned为真表示已经被复制。 为找到组件 o 的复制品应该在组件 o 中保存复制品的地址 pclone。
this->cloned=true;this->pclone=pnew;...if(this->o == NULL)pnew->o=NULL;}else if(this->o->cloned==false){//复制本组件中的每一个元件pnew->o = this->o->clone();}else{pnew->o = this->o->pclone;}
注意,执行一次clone操作后必须将cloned置false.
当然还有其它方法表示是否已经复制.
class Node{static  int Cloned=0;int     cloned=0;...virtual Node * clone(){...if(cloned==Cloned){//已经复制...}else{//未复制...}...}public:Node * clone_for_call(){Cloned++;return clone();}...}

如果Cloned不溢出,就有对每个结点node,node.cloned<=Cloned(已经复制时取等号)。

来源:http://www.tulaoshi.com/n/20160129/1485294.html

延伸阅读
线索化二叉树 这是数据结构课程里第一个碰到的难点,不知道你是不是这样看,反正我当初是费了不少脑细胞——当然,恼人的矩阵压缩和相关的加法乘法运算不在考虑之列。 !-- frame contents -- !-- /frame contents -- 我费了不少脑细胞是因为思考:他们干什么呢?很欣喜的看到在这本黄皮书上,这章被打了*号,虽然我不...
递归遍历与非递归遍历 前面写过一些关于递归的文章,因为那时还没有写到树,因此也举不出更有说服力的例子,只是阐述了“递归是一种思想”,正像网友评价的,“一篇入门的文章”。但只要能能让你建立“递归是一种思想”这个观念,我的努力就没有白费。 !-- frame contents -- !-- /frame contents -- 现在,讲完了二叉...
树 因为现实世界中存在这“树”这种结构——族谱、等级制度、目录分类等等,而为了研究这类问题,必须能够将树储存,而如何储存将取决于所需要的操作。这里有个问题,是否答应存在空树。 !-- frame contents -- !-- /frame contents -- 有些书认为树都是非空的,因为树表示的是一种现实结构,而0不是自然数;我用过的...
才刚开了个头,就要说再见了——在树这里,除了二叉树,别的都还没有讲。为什么可以总结了呢?因为前面已经涉及到了树的两个基本用途,而假如再讲B+、B-,就不能不提到搜索,假如是胜者树就不能不提到排序。为此,把这部分放到后面。 !-- frame contents -- !-- /frame contents -- 我前面所做的努力,只是让你有个基本概念,什么...
一棵二叉查找树是按二叉树结构来组织的。这样的树可以用链表结构表示,其中每一个结点都是一个对象。结点中除了数据外,还包括域left,right和p,它们分别指向结点的左儿子、右儿子,如果结点不存在,则为NULL。 它或者是一棵空树;或者是具有下列性质的二叉树: 1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树...

经验教程

491

收藏

65
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部