族谱网 头条 人物百科

伸展树

2017-10-16
出处:族谱网
作者:阿族小谱
浏览:339
转发:0
评论:0
优点可靠的性能——它的平均效率不输于其他平衡树。存储所需的内存少——伸展树无需记录额外的什么值来维护树的信息,相对于其他平衡树,内存占用要小。缺点伸展树最显著的缺点是它有可能会变成一条链。这种情况可能发生在以非降顺序访问n个元素之后。然而均摊的最坏情况是对数级的——O(logn)实现以下是伸展树的C++实现(用指针实现)#include#ifndefSPLAY_TREE#defineSPLAY_TREEtemplateclasssplay_tree{private:Compcomp;unsignedlongp_size;structnode{node*left,*right;node*parent;Tkey;node(constT&init=T()):left(0),right(0),parent(0),key(init){}}*root;voidleft_rotate(node*x){n...

优点

可靠的性能——它的平均效率不输于其他平衡树 。

存储所需的内存少——伸展树无需记录额外的什么值来维护树的信息,相对于其他平衡树,内存占用要小。

缺点

伸展树最显著的缺点是它有可能会变成一条链。这种情况可能发生在以非降顺序访问n个元素之后。然而均摊的最坏情况是对数级的——O(log n )

实现

以下是伸展树的C++实现(用指针实现)

#include#ifndef SPLAY_TREE#define SPLAY_TREEtemplate<typenameT,typenameComp=std::less>classsplay_tree{private:Compcomp;unsignedlongp_size;structnode{node*left,*right;node*parent;Tkey;node(constT&init=T()):left(0),right(0),parent(0),key(init){}}*root;voidleft_rotate(node*x){node*y=x->right;x->right=y->left;if(y->left)y->left->parent=x;y->parent=x->parent;if(!x->parent)root=y;elseif(x==x->parent->left)x->parent->left=y;elsex->parent->right=y;y->left=x;x->parent=y;}voidright_rotate(node*x){node*y=x->left;x->left=y->right;if(y->right)y->right->parent=x;y->parent=x->parent;if(!x->parent)root=y;elseif(x==x->parent->left)x->parent->left=y;elsex->parent->right=y;y->right=x;x->parent=y;}voidsplay(node*x){while(x->parent){if(!x->parent->parent){if(x->parent->left==x)right_rotate(x->parent);elseleft_rotate(x->parent);}elseif(x->parent->left==x&&x->parent->parent->left==x->parent){right_rotate(x->parent->parent);right_rotate(x->parent);}elseif(x->parent->right==x&&x->parent->parent->right==x->parent){left_rotate(x->parent->parent);left_rotate(x->parent);}elseif(x->parent->left==x&&x->parent->parent->right==x->parent){right_rotate(x->parent);left_rotate(x->parent);}else{left_rotate(x->parent);right_rotate(x->parent);}}}voidreplace(node*u,node*v){if(!u->parent)root=v;elseif(u==u->parent->left)u->parent->left=v;elseu->parent->right=v;if(v)v->parent=u->parent;}node*subtree_minimum(node*u){while(u->left)u=u->left;returnu;}node*subtree_maximum(node*u){while(u->right)u=u->right;returnu;}public:splay_tree():root(0),p_size(0){}voidinsert(constT&key){node*z=root;node*p=0;while(z){p=z;if(comp(z->key,key))z=z->right;elsez=z->left;}z=newnode(key);z->parent=p;if(!p)root=z;elseif(comp(p->key,z->key))p->right=z;elsep->left=z;splay(z);p_size++;}node*find(constT&key){node*z=root;while(z){if(comp(z->key,key))z=z->right;elseif(comp(key,z->key))z=z->left;elsereturnz;}return0;}voiderase(constT&key){node*z=find(key);if(!z)return;splay(z);if(!z->left)replace(z,z->right);elseif(!z->right)replace(z,z->left);else{node*y=subtree_minimum(z->right);if(y->parent!=z){replace(y,y->right);y->right=z->right;y->right->parent=y;}replace(z,y);y->left=z->left;y->left->parent=y;}p_size--;}constT&minimum(){returnsubtree_minimum(root)->key;}constT&maximum(){returnsubtree_maximum(root)->key;}boolempty()const{returnroot==0;}unsignedlongsize()const{returnp_size;}};#endif // SPLAY_TREE


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

文章来源:内容词条
——— 没有了 ———
编辑:阿族小谱

更多文章

更多精彩文章
评论 {{commentTotal}} 文明上网理性发言,请遵守《新闻评论服务协议》
游客
发表评论
  • {{item.userName}} 举报

    {{item.content}}

    {{item.time}} {{item.replyListShow ? '收起' : '展开'}}评论 {{curReplyId == item.id ? '取消回复' : '回复'}}

    回复评论
加载更多评论
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回
打赏
私信

推荐阅读

· 树
术语节点的度:一个节点含有的子树的个数称为该节点的度;树的度:一棵树中,最大的节点的度称为树的度;叶节点或终端节点:度为零的节点;非终端节点或分支节点:度不为零的节点;父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;兄弟节点:具有相同父节点的节点互称为兄弟节点;节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;树的高度或深度:树中节点的最大层次;堂兄弟节点:父节点在同一层的节点互为堂兄弟;节点的祖先:从根到该节点所经分支上的所有节点;子孙:以某节点为根的子树中任一节点都称为该节点的子孙。森林:由m(m>=0)棵互不相交的树的集合称为森林;树的种类无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树;有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树;...
· 树
定义雪曼将军树真双子叶植物或是松柏门二次生长(英语:secondarygrowth)的示意图,每一季木质部会生长,使树干、树枝及根变粗虽然树是一个常用的词语,但没有一个广为认同的定义,不管是植物学上的定义或是日常生活的定义都没有。最广泛的定义,树是一种有细长茎(或树干),可以支持叶子或枝条离地面相当的高度。树也常用高度来定义,高度在0.5至10米(1.6至32.8英尺)的较小植物一般会称为灌木,所以树木的最小高度也只是大致的定义而已。以此定义来看,像香蕉树及番木瓜树等高大的草本植物也算是树。另一个范围较窄的定义是树有木质且会二次生长(英语:secondarygrowth)的茎,也就是除了每年因分生组织而高度增加以外,茎也会每年往外加粗。此定义下,像棕榈树、香蕉树及番木瓜树不论高度多高,都不能视为是树。有些单子叶植物可以在另一个较松一点的定义下归类为树,Joshuatree、棕榈和竹子没有二...
· 树
定义如果一个无向简单图G满足以下相互等价的条件之一,那么G是一棵树:G是没有回路的连通图。G没有回路,但是在G内添加任意一条边,就会形成一个回路。G是连通的,但是如果去掉任意一条边,就不再连通。G是连通的,并且3顶点的完全图K3{\displaystyleK_{3}}不是G的子图。G内的任意两个顶点能被唯一路径所连通。如果无向简单图G有有限个顶点(设为n个顶点),那么G是一棵树还等价于:G是连通的,有n−1条边,并且G没有简单回路。如果一个无向简单图G中没有简单回路,那么G是森林。性质一棵树中每两个点之间都有且只有一条路径(指没有重复边的路径)。一颗有N个点的树有N-1条边,也就是连接N个点所需要的最少边数。所以如果去掉树中的一条边,树就会不连通。如果在一棵树中加入任意的一条边,就会得到有且只有一个环的图。这是因为这条边连接的两个点(或是一个点)中有且只有一条路径,这条路径和新加的边连在一...
· 榧树
外部链接(简体中文)中国数字植物标本馆中的相关内容:榧树
· 桉树
形态一般为常绿乔木;枝、叶花有芳香;叶子通常互生,有柄,全缘羽状脉,多为镰刀形;早春开白色、红色或黄色花,多为伞形或头状花序,萼片与花瓣连合成帽状体(花盖),开花时脱落;蒴果成熟时顶端3-5裂;种子多数有角棱。

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信