赞
踩
struct BRnode //红黑树的结点定义
{
int key; //关键字的值
RBnode * parent; //父结点指针
RBnode * lchild; //左孩子指针
RBnode * rchild; //右孩子指针
int color; //结点颜色,可用0/1表示黑红,也可以使用枚举类型enum表示颜色
}
红黑树依靠三种操作:左旋、右旋和变色能始终保持自平衡。
左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。
右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。
变色:结点的颜色由红变黑或由黑变红。
先忽略颜色,可以看到旋转操作不会影响旋转结点的父结点,父结点以上的结构还是保持不变的。
左旋只影响旋转结点和其右子树的结构,把右子树的结点往左子树挪了。
右旋只影响旋转结点和其左子树的结构,把左子树的结点往右子树挪了。
所以旋转操作是局部的。另外可以看出旋转能保持红黑树平衡的一些端详了:当一边子树的结点少了,那么向另外一边子树“借”一些结点;当一边子树的结点多了,那么向另外一边子树“租”一些结点。
情形一&情形二&情形三
情形四:插入结点的父结点为红结点的几种情况
说明 | 调整步骤 | ||
---|---|---|---|
情况一 | 叔叔结点存在并且为红结点 | 1. 将“父节点”和“叔叔节点”设为黑色。 2. 将“祖父节点”设为“红色”。 3. 把“祖父节点”设为“当前插入节点”。 | |
情况二 | "叔叔结点"不存在或为黑结点,并且插入结点的“父结点”是“祖父结点”的左子结点 | ①插入结点是其父结点的左子结点 | 1. 将“父节点”设为黑色。 2. 将“祖父节点”设为“红色”。 3. 对“祖父节点”进行右旋。 |
②插入结点是其父结点的右子结点 | 1. 对“父节点”进行左旋。 2. 把“父节点”设为“插入结点”。 3. 进行情况二①的处理。 | ||
情况三 | "叔叔结点"不存在或为黑结点,并且插入结点的“父结点”是“祖父结点”的右子结点 | ①插入结点是其父结点的右子结点 | 1. 将“父节点”设为黑色。 2. 将“祖父节点”设为“红色”。 3. 对“祖父节点”进行左旋。 |
②插入结点是其父结点的左子结点 | 1. 对“父节点”进行右旋。 2. 把“父节点”设为“插入结点”。 3. 进行情况三①的处理。 |
情况一:
情况二:
情况三:
红黑树的删除操作也包括两部分工作:一查找目标结点;而删除后自平衡。查找目标结点显然可以复用查找操作,当不存在目标结点时,忽略本次操作;当存在目标结点时,删除后就得做自平衡处理了。删除了结点后我们还需要找结点来替代删除结点的位置,不然子树跟父辈结点断开了,除非删除结点刚好没子结点,那么就不需要替代。
二叉树删除结点找替代结点有3种情情景:
情景1:若删除结点无子结点,直接删除
情景2:若删除结点只有一个子结点,用子结点替换删除结点
情景3:若删除结点有两个子结点,用后继结点(大于删除结点的最小结点)替换删除结点
BST(二叉排序树) | AVL Tree(平衡二叉树) | Red-Black Tree(红黑树) | ||
---|---|---|---|---|
发明时间 | 1960年 | 1962年 | 1972年 | |
时间复杂度 | Search(查) | O(n) | O(log₂n) | O(log₂n) |
Insert(插) | O(n) | O(log₂n) | O(log₂n) | |
Delete(删) | O(n) | O(log₂n) | O(log₂n) |
- 二者的区别:
平衡二叉树AVL: 插入/删除很容易破坏“平衡”特性,需要频繁调整树的形态。如:插入操作导致不平衡,则需要先计算平衡因子,找到最小不平衡子树(时间开销大),再进行LLI/RR/LR/RL调整。
红黑树RBT: 插入/删除很多时候不会破坏“红黑”特性,无需频繁调整树的形态。即便需要调整,一般都可以在常数级时间内完成。- 二者的适用场景:
平衡二叉树: 适用于以查为主、很少插入/删除的场景
红黑树: 适用于频繁插入、删除的场景,实用性更强
1.下列选项中,正确的是( )
①红黑树是一种特殊的二叉查找树
②红黑树中的某棵子树(如果有的话),也一定是二叉查找树
③红黑树中的某棵子树(如果有的话),也一定是红黑树
④红黑树中的某棵子树(如果有的话),一定不是红黑树
A.①②
B.①②③
C.①②④
D.①③
- 红黑树是一种特殊的二叉查找树,满足“左<根<右”的特性。而二叉查找树的定义具有递归特性,其任何一棵子树也是二叉查找树。①②正确
红黑树中的某棵子树T,若T的根为黑色,则该子树也是红黑树;若T的根为红色,则该子树不是红黑树。③④错误
2.下列选项中,错误的是( )
A.非空红黑树的结点要么是红色,要么是黑色
B.在一棵红黑树中,如果一个结点是黑的,那么它的孩子结点(如果有的话)一定是红的
C.在一棵红黑树中,如果所有结点都是黑的,那么它的形态一定是满二叉树
D.红黑树的查找路径上不允许出现两个连续的红结点
- A. 红黑树的性质1
- B. 红黑树中,黑结点的孩子结点可以是红的,也可以是黑的;红结点的孩子结点一定是黑的。
- C. 如果全部结点都是黑色,那只有满二叉树的形态能满足红黑树的性质5。
- D. 红黑树的性质4
3.下列选项中,正确的是( )
①若红黑树根结点黑高度为h,则内部结点数(关键字)最少有
2
h
−
1
2^h-1
2h−1个
②若红黑树根节点黑高度为h,则内部结点数(关键字)最多有
2
h
−
1
2^h-1
2h−1个
③包含n个关键字的红黑树,高度不超过
2
l
o
g
2
n
+
1
2log_2^{n+1}
2log2n+1
④红黑树中,红结点的数量不会超过内部结点总数的一半
A.③④
B.①③④
C.④
D.①②③
- 结点的黑高度是指:从某结点出发(不含该结点)到达任一空叶结点的路径上黑结点总数
D. 红黑树中,从根结点开始查找,任何一条查找路径上,红结点的数量都不可能超过一半。但是整棵树的红结点总数是有可能过半的
4.下列选项中,错误的是( )
A.红黑树中,任何一个结点的左右子树高度之差不超过2倍
B. AVL树中,任何一个结点的左右子树高度之差不超过1
C.红黑树的查找效率一般要优于AVL树
D.红黑树和AVL树的查找/插入/删除操作的最坏时间复杂度都相同
- 平衡二叉树适用以查为主的场景
- 红黑树适用删除、插入的场景
5.下列选项中,错误的是( )
A.对红黑树插入若干关键字,插入次序不同,可能得到不同形态的红黑树
B.对红黑树删除一个关键字,紧接着插入相同的关键字,得到的红黑树可能与原来不同
C.红黑树查找/插入/删除操作的最坏时间复杂度都是
O
(
l
o
g
2
n
)
O(log_2^n)
O(log2n)
D.红黑树常被用于实现数据库索引
- B+树常被用于实现数据库索引
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。