zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    LeetCode Missing Number (简单题)
    LeetCode Valid Anagram (简单题)
    LeetCode Single Number III (xor)
    LeetCode Best Time to Buy and Sell Stock II (简单题)
    LeetCode Move Zeroes (简单题)
    LeetCode Add Digits (规律题)
    DependencyProperty深入浅出
    SQL Server存储机制二
    WPF自定义RoutedEvent事件示例代码
    ViewModel命令ICommand对象定义
  • 原文地址:https://www.cnblogs.com/doyi111/p/11715328.html
Copyright © 2011-2022 走看看