算法导论第13(十三)章红黑树

红黑树的定义:红黑树是一种较为“平衡的”二叉查找树,其每个结点上增加了一个储存颜色的位置,可以是红也可以是黑色的,并且有父亲结点。基本操作时间为O(lgn).

红黑树的性质:1)每个结点或是红的,或是黑的。2)根结点是黑的。 3)每个叶结点(NIL)是黑的。 4)若一个结点是红的,则它的两个儿子都是黑的。5)对每个结点,从该结点到其子孙结点的所有路径上的黑色结点数目相同。

黑高度:从某个结点x出发(不包括该结点)到达一个叶结点的任意一条路径上,黑色结点的个数称为该结点x的黑高度,用bh(x)表示。

引理13.1 一棵有n个内结点的红黑树的高度至多为2lg(n+1).

练习:

13.1-1 使用图13-1a的格式,画出在关键字集合{1,2,....,15}上高度为3的完全二叉查找树。以三种不同方式,向图中加入NIL叶结点并对各结点着色,使所得的红黑树的黑高度分别为2,3,4.

图1表示黑度为4的红黑树,图2表示黑度为3的红黑树,图3表示黑度为2的红黑树。

13.1-2对图13-1中的红黑树,画出调用TREE-INSERT插入关键字36后的结果。结果插入的结点被标为红色,所得的树是否还是一棵红黑树?如果该结点被标为黑色呢?

标为红色后,不是红黑树,不符合性质4. 标为黑色后,不是红黑树,不符合性质5.第3节学习插入函数后,可以知道每插入一个红色结点,可以通过调整使之成为一棵红黑树。

13.1-3 定义松弛红黑树为满足红黑性质1,3,4,5的二叉查找树。换言之,根部可以是红色或是黑色。考虑一棵根是红色的松弛红黑树T。如果将T的根部标为黑色而其他都不变,则所得到的是否还是一棵红黑树?

是。

13.1-4假设将一棵红黑树的每一个红结点“吸收”到它的黑色父结点中,来让红结点的子女变成黑色父结点的子女(忽略关键字的变化)。当一个黑结点的所有红色子女都被吸收后,其可能的度是多少?此结果树的叶子深度怎么样?

度为2时,是左右孩子结点已经都是黑色。度为3时,左或者右孩子结点是红色。 度为4时,左右孩子结点都是红色。 结果树叶子深度都相同。

以下13.1-5~7 都用到了红黑树一个特别的结构,那就是从根结点开始,一层黑一层红,颜色交替,构成了一棵拥有红色结点最多的红黑树。

13.1-5 证明:在一棵红黑树中,从某结点x到其后代叶结点的所有简单路径中,最长的一条是最短一条的至多两倍。

最短:此路径上全是黑色结点。最长:此路径上红黑结点交替出现(红色结点数目=黑色结点数目),又因为不管到最长路径还是到最短路径,黑高(黑色结点数目)都相等。最长:最短=(红+黑):黑=2:1:由此得出论点。

13.1-6 在一棵黑高度为k的红黑树中,内结点最多可能有多少个?最少可能有多少个?

根据引理13.1 至少包含2^k-1个内部结点。至多包含2^(2k)-1个内部结点。(最多就是红黑结点交替出现的情况)

13.1-7 请描述出一棵在n个关键字上构造出来的红黑树,使其中红的内部结点数与黑的内部结点数比值最大。这个比值是多少?具有最小可能比例的树又是怎么样?此比值是多少?

最小可能比值就是所有结点都是黑色,比值为0。 最大可能是红黑结点交替出现,并且最底层是全部是红色结点,比值是2:1.

13.2 旋转

旋转分为:左旋和右旋。

左旋:在某个结点x做左旋时,它的右孩子非空。 右旋:在某个结点x做右旋时,它的左孩子非空。

//两个结点间是由两个指针连接成的 可以说x的孩子结点指向B,同时也是B的父亲结点指向x 由于有父亲结点属性的存在,所以是双向连接

左旋代码如下:

struct Tree*root=NULL;
void LEFT_ROTATE(struct Tree*T,struct Tree*x)
{//左旋转:分三个步骤①②③来叙述旋转代码的。
 struct Tree*y=x->right;//设置y结点。
 x->right=y->left;//本行代码以及下面的if结构表达的是“y的左孩子成为x的右孩子”。①
 if(y!=NULL&&y->left!=NULL)
 {
       y->left->parent=x;
 }
 y->parent=x->parent;//本行代码以及下面的if-else结构表达的过程是“y成为该子树新的根”。②
 if(x->parent==NULL)
 {
       root=y;
 }
 else if(x==x->parent->left)
 {
       x->parent->left=y;
 }
 else x->parent->right=y;
 y->left=x;//本行代码以及下面一行都表达了“x成为y的左孩子”。③
 x->parent=y;
}

13.2-1 写出RIGHT-ROTATE的伪代码。

只需将书中的代码中的right变为left,而left变为right即可。

13.2-2 证明:在一棵有n个结点的二叉查找树中,刚好有n-1种可能的旋转。

因为n个结点有n-1条边,每条边都可以(左或右)旋转,所以有n-1种可能的旋转。

13.2-3设在图13-2的左边一棵树中,a,b,c分别为子树α,β,γ中的任意结点。如果将结点x左旋,则a,b,c深度如何变化?

α上升1层,β不变,γ下降1层。

13.2-4 证明:任何一棵含n个结点的二叉查找树,可以通过O(n)次旋转,转变为另一棵含n个结点的二叉查找树。

每次右(左)旋转,都会使最右(左)链上多一个结点,经过任意n-1次右(左)旋转,任意右(左)总会变成一个单链表。所以任意二叉查找树都能经过O(n)次旋转转换成任意二叉查找树。

13.2-5 如果能够使用一系列的RIGHT-ROTATE调用来把一个二叉查找树T1变为二叉查找树T2,则说T1可以右转成T2。请给出一个两棵树的例子,其中T1不能右转成T2.然后证明如果T1可以右转成T2,则它可以使用O(n^2)次RIGHT-ROTATE调用来右转。

  • 12
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值