- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法导论(十三)--红黑树.pdf
算法导论(十三)--红黑树2013-09-17 17:56:45
分类: C/C++
原文地址:算法导论(十三)--红黑树 作者:yourtommy
由前一章我们知道,二叉查找树的性能与树的高度密切相关,所以让树中的元素尽量地平衡在树的两侧,使得树的高度尽量地低,便可提高二
查找树的性能。红黑树(red-blacktree)是许多 “平衡的”查找树中的一种。
红黑树的性质
1、每个结点或是红的,或是黑的。
2、根结点是黑的。
3、每个叶结点(NIL)是黑的。
4、如果一个结点是红的,则它的两个儿子都是黑的。
5、对每个结点,从该结点到其子孙的所有路径上包含相同数目的黑结点。
红黑树的结点比普通的二叉查找树的结点多了一个颜色属性。下面就是一棵红黑树:
可以看到所有的叶结点都是NIL,且都是黑的。这些叶结点被称为外结点,除了外结点的其它结点便被称为内结点。所有内结点旁标注的数字是
该结点的黑高度,即从该结点出发到达一个叶结点的任意一条路径上的黑色结点的个数 (根据性质5所有路径上黑结点个数一样)。
因为所有的叶结点都是一样的,所以我们可以用一个哨兵元素来表示它:
根结点的父亲也可以使用这个哨兵元素。
下面来分析下红黑树的高度。
我们用bh(x)来表示结点x 的黑高度,先来用归纳法来证明以x为根的子树至少包含2^bh(x) -1个内结点:
1)如果x 的黑高度为0,则x必为叶结点(T.nil),所以该树包含2^0-1 =0个结点。
2) 若x 的孩子是红色的,则该孩子结点的黑高度与x一样,为bh(x);如果x是黑色的,则该孩子结点的黑高度比x少1,为bh(x)-1。所以x
的孩子结点 的黑高度至少为bh(x)-1。根据归纳假设,x 的两个子树里的元素个数至少为(2^(bh(x)-1)-1)+(2^(bh(x)-1)-1)=2^bh(x)-2,
加上x结点本身,则以x为根的红黑树至少有2^bh(x)-1个内结点。归纳成立。
根据红黑树性质4,任何路径上,黑结点的个数不会少于红结点的个数,所以根的黑高度至少是h/2 (h为树的高度)。同时根据上面的结论,可
得:
n ≥2^bh(x)-1≥2^(h/2)-1
可求出h≤2*lg(n+1),所以红黑树的高度为O(lg(n))。
旋转
我们可以通过旋转来改变某些结点在树中的位置而不破坏二叉查找树的性质。
可是看到子树b是所有的元素值都介于结点A和 之间,在旋转操作后b仍然处在两结点之间,二叉查找树的性质得以保持。
下面是左旋(把x结点左移,使得其右孩子y代替x 的位置)的代码:
LEFT_ROTATE(T,x){
1y =x.right;
2x.right=y.left;
3ify.left≠T.nil
4y.left.parent=x;
5y.parent=x.parent;
6ifx.parent==T.nil
7T.root=y;
8elseifx ==x.parent.left
9x.parent.left =y;
10else
11x.parent.right=y;
12y.left =x;
13x.parent=y;
}
右旋的代码则刚好与左旋对称,把left和right对换就可以,这里不再赘述。旋转的操作的运行时间为O(1)。
插入
与二叉查找树相同,每次插入时元素都会被放到叶结点处。
RB_INSERT(T,z){
1y =T.NIL;
2x =T.root;
3whilex !=T.NIL{
4y =x;
5ifz.key x.key
6x =x.left;
7else
8x =x.right
9}
10z.parent=y;
11ify ==T.nil
12T.root=z;
13elseifz.key y.key
14y.left =z;
15else
16y.right=z;
17z.left =T.nil;
18z.right=T.nil;
19z.color =RED;
20 RB_INSERT_FIXUP(T,z);
}
红黑树
原创力文档


文档评论(0)