• java红黑树


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

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

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

    因此,如果你的业务中查找远远多于插入、删除,那选AVL树; 
    如果查找、插入、删除频率差不多,那么选择红黑树。

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

    1. 父为黑

     

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

    2. 父为红

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

     1.叔叔为红

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

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

    2.叔叔为黑 

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

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

     以爸爸为根节点,进行一次R旋转。 
    b)爸爸在左、叔叔在右、我在右 

     

     先以我为根节点,进行一次L旋转; 
    再以我为根节点,进行一次R旋转。 
    c)叔叔在左、爸爸在右、我在左 

     先以我为根节点,进行一次R旋转; 
    再以我为根节点,进行一次L旋转。 
    d)叔叔在左、爸爸在右、我在右 

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

    先暂时到这里吧  红黑树感觉恶心心
    ————————————————
    版权声明:本文为CSDN博主「rainyday66」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_34173549/article/details/79636764

     

  • 相关阅读:
    Android设计模式系列-组合模式
    Android进阶之大话设计模式
    eclipse 安装lua插件
    防止应用被杀死
    lua string 库
    js与java通信
    一个祸害我很久的东东——事件过滤器之按键触发
    Qt主窗口
    新学期——新期望
    鱼C《零基础入门学习Python》10-17节课时知识点总结
  • 原文地址:https://www.cnblogs.com/doyi111/p/11715328.html
Copyright © 2020-2023  润新知