什么是红黑树
红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。
性质
- 节点是红色或黑色。
- 根是黑色。
- 所有叶子都是黑色(叶子是 NIL 节点)。
- 每个红色节点必须有两个黑色的子节点。 (从每个叶子到根的所有路径上不能有两个连续的红色节点。)
- 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
这些性质确保了红黑树的关键特性:从根到叶子的最长的可能路径不多于最短的可能路径的两倍。(根据性质4可得路径不能有两个毗连的红色节点。最短的可能路径都是黑色节点,最长的可能路径是交替的红色和黑色节点。根据性质5可得所有最长路径都有相同数目的黑色节点。所以路径不多于任何其他路径的两倍长)
红黑树与AVL树
联系
红黑树是一种自平衡二叉查找树,AVL 树是最早被发明的自平衡二叉查找树。
红黑树相对于 AVL 树的时间复杂度是一样的,查找、插入和删除的时间复杂度都是 O(log2 n) 。
区别
AVL数增加和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡。
红黑树在插入或者删除节点时,实际的调整次数更少,旋转次数更少。
因此红黑树插入删除的效率高于 AVL 树,大量中间件产品使用了红黑树。
红黑树的插入
1.将每个被插入的节点染为红色。
2.将新节点插入二叉排序树。
3.对树进行调整,使其仍满足红黑树的性质(这时分为五种情形,如下所示)。
情形一
1.红黑树没有其他节点,只有根节点,那就直接标记为黑色。
2.或者经过调整后,红黑树的根节点被变为红色,那就直接把根结点涂为黑色。
情形二
新节点的父节点 P 是黑色,这种情况下性质4和性质5都没有被破坏。不用对树进行调整。
情形三
新插入结点的父节点 P 和叔父节点 U 都是红色。
这时将父节点和叔父节点,都染为黑色,并将爷节点染为红色。再将爷节点视为新插入节点,重新调整。
情形四
父节点 P 是红色而叔父节点 U 是黑色或缺少,并且新节点 N 是其父节点 P 的右子节 点而父节点 P 又是其父节点的左子节点。
先对父节点进行一次左旋转。调换新节点和其父节点的角色。接着,我们按情形 5 处理。
情形五
父节点 P 是红色而叔父节点U 是黑色或缺少,新节点 N 是其父节点的左子节点,而父节点P又是其父节点G的左子节点。在这种情形下,针对祖父节点G进行一次右旋转;在旋转产生的树中,以前的父节点 P 现在是新节点 N 和以前的祖父节点 G 的父节点。最后将染为黑色,G然为红色。
情形总结
(图源自王道)
红黑树的删除
红黑树的删除比较复杂,且再在面试中不会有时间问道红黑树的删除。(删除内容后续补上)