1. 红黑树的概念
红黑树,是一种搜索二叉树,但在每个节点上增加一个存储位表示节点的颜色,可以是Red或Black。通过对任意一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而使接近平衡的。
红黑树的平衡不像是AVL树那样的绝对平衡,红黑树是一种近似平衡,它避免了处理繁琐的平衡因子,同时它搜索的效率也基本没有影响,不过是最坏情况要搜索 2*logN 但是这从时间复杂度上看,与AVL树的绝对logN是一样的。
2. 红黑树的规则
1. 每个节点不是红色就是黑色
2. 根节点是黑色的
3. 如果一个节点是红色的,则它的两个孩子节点是黑色的 (没有两个连续的红节点)
4. 对于每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
5. 每个叶子节点下的空节点都是黑色的,我们管这类空节点叫NIL节点,主要是用来统计总路径用的
只要满足前4条规则就可以满足红黑树中:“最长路径中节点个数不会超过最短路径节点个数的两倍” 的原则。在我们写树,或者说对树进行调整的时候都不需要考虑规则5,规则5就是个计数用的
3. 红黑树的节点
红黑树节点的颜色我们默认给红色。
因为如果默认给黑色的话就会导致每新增一个节点时,该路径的黑色节点就会比别的路径多一个,此时不满足规则4,就要对树进行调整。
但是如果插入的是一个红色节点,如果它的父节点是黑色的,则不用对树进行任何调整,只有它的父节点是红色的,才会违背规则3,需要对树进行调整。
4. 红黑树的插入
红黑树的在插入时要一直符合那4个规则,因此在插入之后有两种调整方案。1. 更新节点的颜色,2. 当更新节点颜色的时候也控制不住这个树了的话就对树进行旋转。
经过总结和推到给出的结果就是:当我们在调整树的时候只需要关注4个节点的状态
分别是当前节点cur,父节点(parent) p,祖父节点(grandparent) g,叔叔节点(uncle) u。
具体到选择那种调整方案的时候只需要看 uncle节点的状态,如果是红色就选第一种更新方案,如果是黑色或者不存在就选第二种更新方案
第一种更新方案是只需要进行颜色的更新就可以维持住红黑树的规则。
第二种更