红黑树
1.红黑树的规则
- 节点时黑色或红色
- 根节点是黑色
- 每个叶子结点都是黑色的空节点(NIL节点)
- 每个红色节点的两个子节点都是黑色(从每个叶子到根的所有路径不能有两个连续的红色节点)
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
以上的约束,确保了红黑树的关键特性:从根到叶子的最长路径,不会超过最短可能路径的两倍。
2.红黑树的变色
插入一个新节点时,可能会使树不再平衡,可以通过三种方式的变换,让树保持平衡:换色,左旋转,右旋转。
对于换色:在插入节点的时候,通常新节点是红色的。在插入节点为红色的时候,有可能插入一次是不违反红黑树规则的。红色节点可能导致出现红红相连的情况,不过可以通过颜色调换和旋转来调整。
3.红黑树的左旋转和右旋转
左旋转:逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为左孩子。
右旋转:顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为右孩子。
4. 红黑树的插入操作
设定:要插入的节点为N,其父节点为P,其祖父节点为G,其父亲的兄弟节点为U。
情况①:新节点N位于树的根上,没有父节点。我们直接将红色变成黑色
情况②:新节点的父节点P是黑色。直接插入即可。
情况③:父红叔红祖黑。将P和U变成黑色,将G变成红色。(但是,如果N的祖父节点的父节点可能是红色,就需要递归调整颜色,如果递归到根节点了,就要进行旋转。)
情况④:父红叔黑祖黑,N是左儿子。变为父黑祖红右旋转。
情况④:父红叔黑祖黑,N是右儿子。方法:以P为根,进行左旋转,形成情况④,接下来按情况④处理。