一、红黑树的介绍
-
通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。
-
在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(logn)。
二、二叉查找树的回顾
(1)二叉查找树的介绍
-
二叉查找树也称有序二叉树,或已排序二叉树;
-
树的这种数据结构,既能像链表那样快速的插入和删除,又能想有序数组那样快速查找。
(2)二叉查找树的基本特征
- 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 没有键值相等的节点;
- 需要保证树总是平衡的(或者至少大部分是平衡的),这就是说对树中的每个节点在它左边的后代数目和在它右边的后代数目应该大致相等
三,红黑树的基本特性
- 每个结点要么是红的,要么是黑的。
- 根结点是黑的。
- 每个叶结点,即空结点(NIL)是黑的。
- 如果一个结点是红的,那么它的俩个儿子都是黑的。
(如果一个结点是黑的,则它的俩个儿子不作要求) - 从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点。
(故需要特别注意黑色节点的设置)
四,红黑树平衡性的修正
-
部分结点颜色,重新着色
-
调整部分指针的指向,即左旋、右旋。
1. 左旋
2. 右旋
五、红黑树的插入和插入修复
-
核心思路:将红色的节点移到根节点(即将出现的问题由下向上抛);然后,将根节点设为黑色
-
插入的节点必须是红色的。将插入的节点着色为红色,不会违背"特性(5)"!少违背一条特性,就意味着我们需要处理的情况越少。
第一步:
将红黑树当作一颗二叉查找树,将节点插入。从树根开始向下查找,找到val值对应的位置,将节点插入;如果查找到与val值相同的结点,则什么也不做,直接返回
第二步:
将插入的节点着色为"红色"。
第三步:
通过一系列的旋转或着色等操作,使之重新成为一颗红黑树。即插入修复。