zoukankan      html  css  js  c++  java
  • 红黑树原理

    定义
        节点有红黑属性,非黑即红
        根节点为黑色
        两个相邻节点不能同时为红色(若同时红色触发recolor或rotation),相邻节点可以是黑色
        能保证节点到任意子节点的null节点路径中经过的黑色节点个数相同
     
    平衡方式
        重标色recolor + 旋转rotation
        新插入节点X
            若X是根节点则标为黑色
            若非根节点则按照二叉树规则插入,并标为红色
                若父节点P为黑色,则结束
                若父节点P为红色
                    若叔叔节点U为红色 -> recolor: P-黑,U-黑, G-红
                    若叔叔节点U为黑色,再判断X与P的位置关系
                        若左左  -> rotation:右旋,  recolor:X-红,G-红,P-黑
                        若右右  -> rotation:左旋,  recolor:X-红,G-红,P-黑
                        若左右  -> rotation: 先左旋,再右旋  recolor:X-黑,G-红,P-红
                        若右左  -> rotation: 先右旋,再左旋  recolor:X-黑,G-红,P-红
     
     
    下图为左左情况
     
     
    下图为左右情况
     
    与平衡二叉树对比
        二者都是平衡的二叉树, AVLTree相对于RBTree是更严格的平衡树
        二者触发平衡动作的因子不同,RBTree是相邻节点都是红色, AVLTree是节点平衡因>1.但二者旋转算法是一样的, 所以先搞懂AVLTree后就比较好理解RBTree了
        由于RBTree不是强平衡,所以树的新增和删除旋转的次数相对少一些.另外通过节点的红黑关系来确定旋转,少了AVLTree递归计算深度.在插入和删除性能上RBTree更优.但是查询没有AVLTree高效和稳定;
     
    应用场景
        AVLTree目前应用于WindowsNT
        RBTree应用在HashMap
    Talking with giants
  • 相关阅读:
    POJ 2253 Frogger
    POJ 2387
    codevs3981动态最大子段和(线段树)
    P3398仓鼠(LCA)
    codevs1036商务旅行(LCA)
    codevs3728联合权值(LCA)
    P3390矩阵快速幂
    codevs1574广义斐波那契数列
    POJ3070Fibonacci
    P3379最近公共祖先(LCA)
  • 原文地址:https://www.cnblogs.com/newcooler/p/14668342.html
Copyright © 2011-2022 走看看