红黑树元素的插入和删除

1.红黑树

       平衡搜索二叉树的查询性能很好。(注意:平衡和搜索是两个修饰词。平衡是左右子树高度差不差过1,搜索是对于任一节点来说,左子树所有节点值<节点值<右子树所有节点的值)红黑树就是在确保搜索性质前提下,通过特有的性质来保持平衡的这样一类树。

       重要的性质:

       根是黑的,叶节点是黑的。(大部分以null为叶节点)

       对于任意节点而言,其到叶节点树尾端(null指针)的每条路径都包含相同数量的黑节点。

       如果一个结点是红的,那么它的两个儿子都是黑的。

       红黑树的查找、删除、插入的时间复杂度最坏为O(logn)。

       当进行查找和删除时,可能会影响红黑树的性质,可能要对节点重新着色或左旋、右旋操作。

       插入时遇到的情况:

       a.父节点为R,叔叔节点为R

       b.父节点为R,叔叔节点为B,当前节点是右子

       c.父节点是R,叔叔节点是B,当前节点是左子

       处理方法:

        a.将父节点和叔叔节点涂黑,祖父节点涂红,把当前节点指向祖父节点,从新的当前节点开始算法。

        b.以当前节点的父节点作为新的当前节点,以新的当前节点左旋。

        c.父节点变为黑色,祖父节点变为红色,以祖父节点为支点右旋。

        红黑树的插入难点是插入之后的维稳,即成为一颗平衡的二叉树。

        红色节点需要有两个黑色子节点。

2.红黑树的删除

 情况1:x的兄弟w是红色的。


情况2:x的兄弟w是黑色的,且w的俩个孩子都是黑色的。


情况3:x的兄弟w是黑色的,w的左孩子是红色,w的右孩子是黑色。


情况4:x的兄弟w是黑色的,且w的右孩子时红色的。


针对情况1:x的兄弟w是红色的。
对策:改变w、p[z]颜色,再对p[x]做一次左旋,红黑性质得以继续保持。x的新兄弟new w是旋转之前w的某个孩子,为黑色。


针对情况2:x的兄弟w是黑色的,且w的俩个孩子都是黑色的。
对策:因为w也是黑色的,所以x和w中得去掉一黑色,最后,w变为红。
p[x]为新结点x,赋给x,x<-p[x]。


针对情况3:x的兄弟w是黑色的,w的左孩子是红色,w的右孩子是黑色。
对策:交换w和和其左孩子left[w]的颜色。 即上图的D、C颜色互换。:D
并对w进行右旋,而红黑性质仍然得以保持。
现在x的新兄弟w是一个有红色右孩子的黑结点,于是将情况3转化为情况4.


针对情况4:x的兄弟w是黑色的,且w的右孩子时红色的。
对策:做颜色修改,并对p[x]做一次旋转,可以去掉x的额外黑色,来把x变成单独的黑色,此举不破坏红黑性质。
将x置为根后,循环结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值