红黑树:搜索二叉树,节点中加了颜色,不是红色就是黑色,树中最长路径不超过最短路径的2倍。
AVL树是严格平衡的二叉搜索树,红黑树是近似平衡二叉树。
- 红黑树的性质
总结:1、根是黑的 ;2、没有连续的红节点;3、每条路径都有相同数量的黑节点。
- 为什么满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的2倍?
- 答:最短路径:全黑,最长路径:一黑一红,所以最多是2倍。
插入
Case1:cur为红,p为红,g为黑,u存在且为红.
----> p和u变红,g变红。
- 如果g是根,把g再变黑,结束。
- 如果g不是根,在看g父亲的颜色,如果g的父亲是黑色,结束。如果g的父亲是红色,继续往上处理。
这样变化保证没有连续的红节点,且保持子树中每条路径的黑节点的数量不变。
cur有可能是新增,也有可能是下面子树的祖父,原来是黑色的,是由于变色处理变成红色的。
针对上面情况的抽象图如下:
Note:不管是什么情况变化来的,这里处理一样。只要u存在且为红,那么p和u变黑,g变红,再继续往上处理。这里只关注颜色,而p, g, u几个节点在左边或右边都一样处理。
Case2:cur为红,p为红,g为黑,u不存在 / u为黑.
- 1、u不存在,那么cur就是新增节点。
- 右单旋,g变红,p变黑。
- 2、u存在,那么cur一定不是新增节点。
- cur原来是黑的,这里变红,是由case1变来的。
- 右单旋,g变红,p变黑。
针对上面情况的抽象图如下:
Case3:cur为红,p为红,g为黑,u不存在 / u为黑.
---->旋转+变色
- 1、u不存在,那么cur就是新增节点。
- 左右双旋(p左旋,g右旋),g变红,cur变黑。
- 2、u存在,那么cur一定不是新增节点。
针对上面情况的抽象图如下: