红黑树Youtube学习内容整理

1 红黑树的定义

在这里插入图片描述
不太理解的是:1)为什么红黑树中把空指针当做叶子结点? 2)红黑树中从某一结点到所有NIL叶子的路径都具有相同数目的黑色结点数目,这一性质是怎么由红黑树的其他性质得到的? 3)红黑树中规定红色结点的孩子必须全为黑色,为什么没有规定黑色结点的孩子必须全部为红色?如果这样规定的话必然会使得整个树的结构为黑色和红色逐层交替的,且由于树根一定为黑色,这样红黑树的整个结构就会固化成为黑-红-黑-红这样的机构了。所以这样的固定应该是增加了红黑树本身的一个结构多样性。4)红黑树的红色结点和黑树结点在实际问题中具有什么不同的含义吗?5)红黑树结构能够推广成多种颜色树吗?

2 红黑树的性质

在这里插入图片描述
任意结点到最远的NIL叶子结点和最近的NIL叶子结点的路径中必然包含相同数量的黑色结点(不包括当前结点,即当前结点也是黑色结点的情况下)。所以理论上最短的路径应该是只有黑色结点,但是实际情况这种路径并不一定存在; 理论上最长的路径应该是红色和黑树结点交替的,因为这样能使得树的高度最高,交替情况下红色结点数可能比黑色结点数少1,也有可能比黑色结点数多1,同样的这种最长路径实际中也不一定存在。最长路径 与 最短路径 在理想情况下的比值为2, 所以实际情况只能严谨地说不超过2。

3 红黑树增加一个结点的四种情况

这个在youtube视频中分了四种情况来讨论,但是我并不能完全清楚对应的调整操作的一个原因, 并且视频中构造显示的红黑树部分违背了定义中的一些规则,据视频的作者所说这是因为他所给的例子只是某棵完整红黑树的一部分
鉴于此,只把作者的结论记录如下,如有错误待继续进行修正
在这里插入图片描述在这里插入图片描述
将Z变为红色的原因?这样插入的话有可能会破坏红黑树定义中的2和3这两个条件,但是证实这样非常方便进行后续的一个调整

Z是待插入的结点,按照Z要插入的位置与原来的红黑树的相对位置关系:

3.1 Z是根结点

在这里插入图片描述
直接将染红后的结点染黑就行,因为这里原来就是一个空树,但是树根必须为黑色结点

3.2 Z的uncle结点为红色结点

在这里插入图片描述
做法如下:更改Z的parent、uncle为黑色,更改Z的grandparent为红色
做法分析: 对Z的parent的颜色做一下假设,
1)如果Z的parent的颜色为红色,
那么插入的Z会导致树中出现上下连续的红色结点,违背定义3,所以必然要把Z的parent改为黑色;
但是此时由于Z的uncle为红色,B到A的左孩子NIL包含2个黑色结点,而B到C的左右NIL孩子都只包含1个黑色结点,违背定义4, 所以必然要把Z的uncle也改成黑色;
这里的B并不一定是树的根结点,当B为root的时候,此时没有矛盾存在,但是当B存在parent的时候,对于B的parent来说D来说,如果D还有其他的孩子,那么就会违背定义4, 因为此时从D到 以B为根的这棵子树的所有根结点NIL 的黑色结点数都会多1.
2)如果Z的parent的颜色为黑色,
此时情况与上一种情况其实完全一样,只是不用手动的将parent设置为黑色了。
因为Z的约束,Z的parent只能是黑色。

在这里插入图片描述
在这里插入图片描述

3.3 Z的uncle为黑色,且Z、Z的parent、Z的parent构成了一个三角形(也就是说Z的祖孙三代的继承树是左右交替的,打个不恰当的比喻比如女儿是左,儿子是右,这样方便理解)

在这里插入图片描述
做法如下:向与Z相反的方向来旋转Z以及Z的parent, 这样会Z会取代Z的parent的位置,而Z的parent会反过来变成Z的一个孩子
在这里插入图片描述
在这里插入图片描述
做法分析:同样对Z的parent的颜色做出讨论,
1)如果A是红色, 那么必然违背定义3, 感觉应该也需要对颜色做出调整,但是视频中并没有说到这一点。
2)如果A是黑色,不会违背定义3,

3.4 Z的uncle为黑色,且Z,Z的parent, 以及Z的grandparent呈现直线排列

做法如下:旋转Z的grandparent来让Z的parent来取代Z的grandparent的位置;需要重新调整Z的parent以及grandparent的颜色
在这里插入图片描述
在这里插入图片描述
做法分析:这里看最终结果依然是违背定义4的,但是作者的回复说的是Z下面应该还有子树,会使得B和Z具有同样的black height

4 实际例子

https://www.youtube.com/watch?v=A3JZinzkMpk

5 时间复杂度在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值