【数据结构】红黑树插入的实例演示

前篇记录了红黑树的基础知识,以及左旋右旋的操作。其实左旋右旋还包括LLRR LR RL四种旋转,下面我们就来看一棵红黑树的插入具体实现操作。


注,本文的部分图文引自July博客的红黑树从头至尾插入和删除节点的全程演示图,该博客是很有分量的一个博客,各位想学习算法,大数据处理方面的内容,可戳链接直接进入。


先再来回顾一下红黑树的5个性质:

性质1.节点是红色或黑色。

性质2.  根节点是黑色。

性质3  每个叶节点(NIL节点,空节点)是黑色的。

性质4  每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

性质5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。



为了实现一个红黑树的插入操作,我们需要完成2个步骤:

1.先对一个节点进行插入操作(对照下面的RB-INSERT(T,z))

2.该结点插入后即被染成红色,这可能破坏了红黑树的5个性质,所以,我们要实现插入新节点后的一系列重染色操作(对照下面的RB-INSERT-FIXUP(T,z))

 

贴出2份伪代码,并对上面的伪代码进行分析。

RB-INSERT(T, z)
1  y ← nil[T]                 // y 始终指向 x 的父结点。
2  x ← root[T]              // x 指向当前树的根结点,
3  while x ≠ nil[T]
4      do y ← x
5         if key[z] < key[x]         
6            then x ← left[x]
7            else x ← right[x]         // 为了找到合适的插入点,x 探路跟踪路径,直到x成为NIL 为止。
8  p[z] ← y         // y置为插入结点z 的父结点。
9  if y = nil[T]
10     then root[T] ← z
11     else if key[z] < key[y]
12             then left[y] ← z
13             else right[y] ← z     //此 8-13行,置z 相关的指针。
14  left[z] ← nil[T]
15  right[z] ← nil[T]            //设为空,
16  color[z] ← RED             //将新插入的结点z作为红色
17  RB-INSERT-FIXUP(T, z)   //因为将z着为红色,可能会违反某一红黑性质,<
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值