红黑树学习中篇

来源:互联网 发布:快递单打印软件 编辑:程序博客网 时间:2024/04/29 07:05

本篇讲述红黑树的插入,学完前面的两篇,就拥有了二成功力,学完此篇则拥有五成功力,开始吧。。。

 

疑问:为什么插入的节点是红节点?
答:红黑树的节点插入默认是节点为红色的,插入黑点会增加路径上黑点的数目,一定会破坏性质5;插入红点,当其父节点为黑色时,不影响平衡,继续保持红黑性质,当其父节点为红色时,可能破坏性质2(根节点是黑色的)、性质4(红色节点的子节点一定是黑色节点),需要进行修正。但是,对于一般红黑树来说,黑父的情况概率最大。
另外说明下,本文内容大部分来自:
http://blog.csdn.net/haidao2009/article/details/8077514

 

下边各种情况以父节点、叔节点的形式展开:

1、黑父

   如下图所示,如果新节点的父结点为黑色结点,那么插入一个红点将不会影响红黑树的平衡,此时插入操作完成。红黑树比AVL树优秀的地方之一在于黑父的情况比较常见,从而使红黑树需要旋转的几率相对AVL树来说会少一些。

2、红父
     如果新节点的父结点为红色,这时就需要进行一系列操作以保证整棵树红黑性质。如下图所示,由于父结点为红色,此时可以判定,祖父结点必定为黑色。这时需要根据叔父结点的颜色来决定做什么样的操作。青色结点表示颜色未知。由于有可能需要根结点到新点的路径上进行多次旋转操作,而每次进行不平衡判断的起始点(我们可将其视为新点)都不一样。所以我们在此使用一个蓝色箭头指向这个起始点,并称之为判定点。

2.1 红叔
    当叔父结点为红色时,如下图所示,无需进行旋转操作,只要将父和叔结点变为黑色,将祖父结点变为红色即可。但由于祖父结点的父结点有可能为红色,从而违反红黑树性质。此时必须将祖父结点作为新的判定点继续向上(迭代)进行平衡操作。(注意这里是需要迭代的,有可能会调整到根节点)

需要注意的是,无论“父节点”在“叔节点”的左边还是右边,无论“新节点”是“父节点”的左孩子还是右孩子,它们的操作都是完全一样的(其实这种情况包括4种,只需调整颜色,不需要旋转树形)。

2.2 黑叔
当叔父结点为黑色时,需要进行旋转,以下图示了所有的旋转可能:(case1 和caes 2 都是把左边较大的节点调整到上面去

Case 1:

Case 2:

这里case 2的图示进行了简化,case 2 需要L变换成case 1 的情形如下然后再R旋转,得到最后的结果(省略叶节点)。

Case 3:

Case 4:

      可以观察到,当旋转完成后,新的旋转根全部为黑色,此时不需要再向上回溯进行平衡操作,插入操作完成。需要注意,上面四张图的“叔”、“1”、“2”、“3”结点有可能为黑哨兵结点。

0 0
原创粉丝点击