学习之旅-红黑树之插入新节点

关于红黑树的帖子不可谓不多。一开始我看的是july的帖子(链接:http://blog.csdn.net/v_JULY_v/article/details/6105630),但是删除的时候他这系列说的不是很明白。也可以看维基百科上对于红黑树的说明,说的很清楚,但是全是英文的。。。


 这里主要讲讲我自己的理解,以我自己学习红黑树的经历来说的。


红黑树就是查找二叉树的一种,因为一般查找二叉树有可能退化成一条单链表。比如在你插入的节点的key是排好序的的时候有可能就会成为一条链表。所以就有了红黑树。使得不会退化成链表。

说到红黑树,就不得不说他的五大特点,这也是红黑树得以保持平衡的关键。

  1. 每个结点要么是红的要么是黑的。  
  2. 根结点是黑的。  
  3. 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。  
  4. 如果一个结点是红的,那么它的两个儿子都是黑的。  
  5.  对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。

我觉得1,2,3,4都很好理解,主要是5,这个可以看下面这个图。

从图上可以明确看出,从根节点13到每个叶子节点(NIL)的所有路径上都只有3个黑色的黑色节点,比如 13(黑)->8(红)->1(黑)->NILL黑)。


那么现在目标很明确。我要构造这样的一颗二叉树。分为下面的几个步骤:


一、先进行二叉查找树的插入操作。 

二叉查找树的插入很简单,先把要插入的节点的key与根进行比较,小则和根的左孩子做比较,大则跟右孩子作比较,直到找到叶子节点。值得注意,这样的插入操作,新插入的节点必定是原来叶子节点的位置。比如在上面的树种插入节点21,则会是下面的情况,暂且不考虑节点21的颜色该是红还是黑:


二、新插入的节点可能破坏了红黑树的平衡,所以进行平衡调整。

现在按照二叉查找树的插入方式插入了节点21,那么这个21该是什么颜色呢?

1、黑色,如果是黑色,那么不管原来的红黑树是什么样的,这样一定会破坏平衡,因为原来的树是平衡的,现在在这一条路径上多了一个黑色,必然违反了性质5(不记得的时候多看几遍性质,并理解是最好的)。
2、红色,如果新插入的点是红色的,那么也有可能会破坏平衡,主要可能是违反了性质4,比如上图中,新插入的点21的父节点22为红色。但是却有一种特殊情况,比如上图中,如果我插入一个key=0的节点。把0这个节点置为红色,并不会影响原来树的平衡,因为0的父节点是黑色。如下图:

好歹也有不需要调整的情况,所以还是选择把新插入的节点颜色置为红色


如果新插入的点是红色ÿ

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值