红黑树的特性和插入操作详解

856 阅读2分钟

红黑树的特性:

(1)每个节点不是黑色就是红色。 (2)根节点必须是黑色。 (3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!] (4)如果一个节点是红色的,则它的子节点必须是黑色的。 (5)从任一节点到其每个叶子的简单路径都包含相同数目的黑色节点

红黑树的应用

红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。

例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。

红黑树是相对平衡的

而性质4和5共同决定了:最长路径的节点总数量不会超过最短路径的两倍。因为黑色节点数量要一样,红色不能连着来,从而路径全黑时最短,红黑交替时最长。比如4个黑色节点,最短:黑-黑-黑-黑(4),最长:黑-红-黑-红-黑-红-黑(7)。 因为路径长度/高度差有了一定限制,所以称红黑树是有一定平衡性的,不会出现极端倾斜的情况。

红黑树的添加操作

首先我们让添加的节点原始颜色设置为红色,因为这样就不会破坏每个节点到其所有叶子结点黑色节点数目相同的性质

如果添加节点的父亲节点是黑色,那很顺利的完成任务

如果添加为根节点,直接涂黑就行了

但是如果添加节点的父亲节点是红色,就违背了红色节点的子节点必须是黑色的性质了

image.png

image.png

image.png

插入总结与实例

首先根据二叉树的添加节点方法,先插入再说;

插入后,以刚插入的节点作为当前平衡节点N,进行平衡操作。现在回头看插入平衡的这几种情形,其实并不复杂:

N为根:涂黑完事;

父黑:啥事不用管;

父红叔红:父/叔涂黑,祖父涂红,然后把祖父当成新的平衡节点递归处理(我们下面平衡了,让他老人家和上面沟通吧);

父红叔黑:父节点和新插入节点同一边的话,扭一下就完事了(同左右旋,同右左旋,顺便涂色);不在同一边的话,先扭到同一边吧。

例:插入 10,20,15,30,5,8; 为了简化,图中没有画出null的黑色节点。

image.png