红黑树

红黑树(R-B TREE,全称:Red-Black Tree),本身是一棵二叉查找树,在其基础上附加了两个要求:
1.树中的每个结点增加了一个用于存储颜色的标志域;
2.树中没有一条路径比其他任何路径长出两倍,整棵树要接近于“平衡”的状态。
这里所指的路径,指的是从任何一个结点开始,一直到其子孙的叶子结点的长度;接近于平衡:红黑树并不是平衡二叉树,只是由于对各路径的长度之差有限制,所以近似于平衡的状态。
红黑树对于结点的颜色设置不是任意的,需满足以下性质的二叉查找树才是红黑树:
1.树中的每个结点颜色不是红的,就是黑的;
2.根结点的颜色是黑的;
3.所有为 nil 的叶子结点的颜色是黑的;(注意:叶子结点说的只是为空 (nil 或 NULL)的叶子结点!)
4.如果此结点是红的,那么它的两个孩子结点全部都是黑的;
5.对于每个结点,从该结点到到该结点的所有子孙结点的所有路径上包 含有相同数目的黑结点;

红黑树中每个结点都有各自的黑高度,整棵树也有自己的黑高度,即为根结点的黑高度,例如图 1 中的红黑树的黑高度为 3。

对于一棵具有 n 个结点的红黑树,树的高度至多为:2lg(n+1)。
红黑树进行查找操作时的时间复杂度为O(lgn)

红黑树本身作为一棵二叉查找树,所以其任务就是用于动态表中数据的插入和删除的操作。在进行该操作时,避免不了会破坏红黑树的结构,此时就需要进行适当的调整,使其重新成为一棵红黑树,可以从两个方面着手对树进行调整:
调整树中某些结点的指针结构;
调整树中某些结点的颜色;

当创建一个红黑树或者向已有红黑树中插入新的数据时,只需要按部就班地执行以下 3 步:
1.由于红黑树本身是一棵二叉查找树,所以在插入新的结点时,完全按照二叉查找树插入结点的方法,找到新结点插入的位置;
2.将新插入的结点结点初始化,颜色设置为红色后插入到指定位置;(将新结点初始化为红色插入后,不会破坏红黑树第 5 条的性质)
3.由于插入新的结点,可能会破坏红黑树第 4 条的性质(若其父结点颜色为红色,就破坏了红黑树的性质),此时需要调整二叉查找树,想办法通过旋转以及修改树中结点的颜色,使其重新成为红黑树!

在红黑树中删除结点,思路更简单,只需要完成 2 步操作:
1.将红黑树按照二叉查找树删除结点的方法删除指定结点;
2.重新调整删除结点后的树,使之重新成为红黑树;(还是通过旋转和重新着色的方式进行调整)

在二叉查找树删除结点时,分为 3 种情况:
1.若该删除结点本身是叶子结点,则可以直接删除;
2.若只有一个孩子结点(左孩子或者右孩子),则直接让其孩子结点顶替该删除结点;
3.若有两个孩子结点,则找到该结点的右子树中值最小的叶子结点来顶替该结点,然后删除这个值最小的叶子结点。

红黑树,虽隶属于二叉查找树,但是二叉查找树的时间复杂度会受到其树深度的影响,而红黑树可以保证在最坏情况下的时间复杂度仍为O(lgn)。当数据量多到一定程度时,使用红黑树比二叉查找树的效率要高。

同平衡二叉树相比较,红黑树没有像平衡二叉树对平衡性要求的那么苛刻,虽然两者的时间复杂度相同,但是红黑树在实际测算中的速度要更胜一筹!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值