对于一棵有效的红黑树二叉树而言我们必须增加如下规则:
- 每个节点都只能是红色或者黑色
- 根节点是黑色
- 每个叶节点(NIL节点,空节点)是黑色的。
- 如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
将一个节点添加到红黑树中,通常需要下面几个步骤:
插入
将新插入的节点设置为红色
有没有疑问,为什么新插入的节点一定要是红色的,因为新插入节点为红色,不会违背红黑规则第(5)条,少违背一条就少处理一种情况。
通过旋转和着色,使它恢复平衡,重新变成一颗符合规则的红黑树。
要想知道怎么样进行左旋和右旋,首先就要知道为什么要进行左旋和右旋。
我们来对比下红黑树的规则和新插入节点后的情况,看下新插入节点会违背哪些规则。
(1)节点是红色或黑色。
这一点肯定是不会违背的了。
(2)根节点是黑色。
这一点也不会违背了,如果是根节点,只需将根节点插入就好了,因为默认是黑色。
(3)每个叶节点(NIL节点,空节点)是黑色的。
这一点也不会违背的,我们插入的是非空的节点,不会影响空节点。
(4)每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
这一点是有可能违背的,我们将新插入的节点都设置成红色,如果其父节点也是红色的话,那就产生冲突了。
(5)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
这一点也不会违背,因为我们将新插入的节点都设置成红色。
新插入的节点的父节点是红色
①新插入节点N的父节点P和叔叔节点U都是红色。方法是:将祖父节点G设置为红色,父节点P和叔叔节点U设置为黑色,这时候就看似平衡了。但是,如果祖父节点G的父节点也是红色,这时候又违背规则(4)了,怎么办,方法是:将GPUN这一组看成一个新的节点,按照前面的方案递归;又但是根节点为红就违反规则(2)了,怎么办,方法是直接将根节点设置为黑色(两个连续黑色是没问题的)。

②新插入节点N的父节点P是红色,叔叔节点U是黑色或者缺少,且新节点N是P的右孩子。方法是:左旋父节点P。左旋后N和P角色互换,但是P和N还是连续的两个红色节点,还没有平衡,怎么办,看第三种情况。

③新插入节点N的父节点P是红色,叔叔节点U是黑色或者缺少,且新节点N是P的左孩子。方法是:右旋祖父节点G,然后将P设置为黑色,G设置为红色,达到平衡。此时父节点P是黑色,所有不用担心P的父节点是红色。

本文详细解析红黑树的插入操作及维护平衡的过程,包括新节点为何设为红色、可能违背的规则及如何通过旋转和着色恢复平衡。
177万+

被折叠的 条评论
为什么被折叠?



