java的红黑树_java红黑树

红黑树性质

1、每个结点或是红色的,或是黑色的

2、根节点是黑色的

3、每个叶结点(NIL)是黑色的

4、如果一个节点是红色的,则它的两个儿子都是黑色的。

5、对于每个结点,从该结点到其叶子结点构成的所有路径上的黑结点个数相同。

和AVL树的比较

AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效。但AVL树插入、删除结点后旋转的次数比红黑树多。

红黑树用非严格的平衡来降低插入删除时旋转的次数。

因此,如果你的业务中查找远远多于插入、删除,那选AVL树;

如果查找、插入、删除频率差不多,那么选择红黑树。

插入过程

默认插入的结点为红色。为何?

因为红黑树中黑节点至少是红节点的两倍,因此插入节点的父节点为黑色的概率较大,而此时并不需要作任何调整,因此效率较高。

1. 父为黑

4965c5ac2d78f98f701d14bf948eacab.png

插入后无需任何操作。由于黑节点个数至少为红节点的两倍,因此父为黑的情况较多,而这种情况在插入后无需任何调整,这就是红黑树比AVL树插入效率高的原因!

2. 父为红

父为红的情况破坏了红黑树的性质,此时需要根据叔叔的颜色来做不同的处理。

0512bf63271270d6078badcb3a31920c.png

1.叔叔为红

f015d05aaa9307dbad5069cd15596fc5.png

此时很简单,只需交换爸爸、叔叔和爷爷的颜色即可。

此时若爷爷节点和太爷爷节点颜色相同,再以爷爷节点为起始节点,进行刚才相同的操作,即:根据爷爷的兄弟颜色做相应的操作。

2.叔叔为黑

此时较为复杂,分如下四种情况:

a)爸爸在左、叔叔在右、我在左

c9ef3fa15b1370036b5127ddbaf98afd.png

以爸爸为根节点,进行一次R旋转。

b)爸爸在左、叔叔在右、我在右

1390f9aeb9e6e9e7797a2d89b7bd8d30.png

93f3ec34922f541c3b9b6be9f21dc0cc.png

先以我为根节点,进行一次L旋转;

再以我为根节点,进行一次R旋转。

c)叔叔在左、爸爸在右、我在左

9ce6a315f2e050d4e3773913ae7f26ca.png

先以我为根节点,进行一次R旋转;

再以我为根节点,进行一次L旋转。

d)叔叔在左、爸爸在右、我在右

657f1457d68fa753532ea9eacdac8ed5.png

以爸爸为根节点,进行一次L旋转。

先暂时到这里吧  红黑树感觉恶心心

————————————————

版权声明:本文为CSDN博主「rainyday66」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_34173549/article/details/79636764

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值