红黑树原理

定义
    节点有红黑属性,非黑即红
    根节点为黑色
    两个相邻节点不能同时为红色(若同时红色触发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
原文地址:https://www.cnblogs.com/newcooler/p/14668342.html