红黑树为什么要有 nil节点_字节三面:小伙子你先跟我说一说红黑树吧

2-3-4树

定义

  1. 所有的叶子节点都拥有相同的深度
  2. 节点只能是2-节点,3-节点,或者4-节点2节点 包含一个元素的节点,有两个子节点3节点 包含两个元素的节点,有三个子节点4节点 包含三个元素的节点,有四个子节点
  3. 所有节点都有至少两个子节点或没有子节点

来解释一下性质和一些定义

  1. 任意一个叶子节点(也就是没有子节点的节点)到根节点的距离一致
  2. 一个节点中可能包括1,2,3个元素,有2,3,4,个子节点,具体可以看下面的图
  3. 一个节点要么有至少两个子节点,要么没有节点

关于子节点如何定义的

2节点 左子树所有元素小于key1,右子树所有元素大于key13节点 左子树所有元素小于key1,中间子树所有元素大key1小于key2,右子树大于key24节点 左子树所有元素小于key1,第二个子树所有元素大于key1小于key2,第三个子树所有元素大于key2小于key3,右子树所有元素大于key3
1a65d1a3254ae7325fedaa4b8bba6b81.png

为什么要提到234树呢,因为234树和红黑树是完全等价的,在程序中实现234树比较繁琐,所以使用了红黑树来代替

来看234树的添加操作

e889634ab479a48c839b799f8f59d0b7.png

添加如果出现需要分裂的情况,分裂出的元素首先进行和父级合并,如果父级已经是4节点那么将父级分裂,递归操作

234树的生长全部都是从叶子节点进行生长的,从叶子节点进行分裂向上延伸

红黑树

性质

  1. 每个节点要么红色,要么黑色
  2. 根节点是黑色
  3. 每个子节点 (NIL) 是黑色
  4. 每个红色节点的两个子节点一定是黑色
  5. 任意一节点到每个叶子节点的路径都包含数量相同的黑节点

解释一下性质

性质4和性质5说一下

如果一个红色节点那么它的两个子节点必须为黑色,包括nil节点,也就是说不能有两个红色节点相连

任意一个叶子节点或没有子节点的节点到根节点经过的黑色节点数量都一致,不懂下面再解释

叶子节点 : 标记为NIL,为虚拟节点,颜色必须为黑色,234中叶子节点为没有子节点的节点,而红黑树的叶子节点是虚拟的节点

3节点的两种形态如果红色在左边就叫做左倾,红色在右边就叫做右倾

将234树进行转换为红黑树操作

右倾

dffefd5dc3a3d49baed796ec8bc3042b.png

左倾

5df7e5848c0b5a94411cce4b883b9c62.png

现在来看一下几个没有子节点的节点下面其实都有两个NIL节点我们可以任意从一个nil节点出发,到6根节点,所经过的黑色节点个数是一样的,一般情况下NIL节点是不画出来的,但是不代表不存在

红黑树操作

变色:节点的颜色由黑变红或者由红变黑

左旋:以某个节

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值