algorithm - 红黑树旋转:当我有 y = x.right; x.right = y.left。y.left.p = x 写成 x.right.p = x 一样吗
问题描述
在 CLRS 中,作者通过以下伪代码介绍了红黑树中的旋转操作:
LEFT-ROTATE(T, x)
y = x.right # Line 1
x.right = y.left # Line 2
if y.left ≠ T.nil # Line 3
y.left.p = x # Line 4
y.p = x.p
if x.p == T.nil
T.root = y
elseif x == x.p.left
x.p.left = y
else x.p.right = y
y.left = x
x.p = y
其中属性 .left、.right、.p 对应于它的左、右孩子和它的父母。T 是树。
我的主要问题在于第 3 行和第 4 行:
为什么我需要有第3行的if条件?书上说 NIL 实际上是红黑树的叶子,所以我假设 NIL 也可以有父指针。这些代码应该在没有第 3 行的情况下仍然有效。
使用第 1 行和第 2 行,我可以将第 4 行写为
x.right.p = x
吗?如果它们实际上是相同的,那么作者选择将其写成的原因是y.left.p = x
什么?
我的直觉是,这x.right.p = x
与y.left.p = x
. 但是,我找不到一个很好的解释。我已经检查了指针的定义,但是在我搜索了很多之后它仍然很混乱......
解决方案
注意:我没有在每个图表上放置父关系箭头以消除一些混乱。
空节点不能有父节点,如图所示。这里有更深入的解释
y.left
如图所示,如果NEVER 为空,则不需要对第 3 行进行检查。如果不能保证这一点,则此检查是为了防止“空指针取消引用”错误”。使用的选择
y.left.p = x
是用户的喜好。对我来说,这要清楚得多。我们正在制作"y left subtree into x right subtree"
.
@HolderRoy 显示的示例将起作用,但它会进行额外的分配以可能存储y.left
指针,foreach 函数调用。
推荐阅读
- r - 将国家水文数据集底图添加到传单地图
- excel - 我可以分配一个包含工作簿名称的字符串值作为参数吗?
- postgresql - 您可以在 PL/pgSQL 中将日期数组设置为常量吗?
- c# - 如何在.net core3 WPF C#中询问文件名路径
- mysql - 如何在自联接中编写随行的当前迭代而变化的条件
- angular - 在 Angular 7 中使用 Google Map API 根据值加载不同的标记
- aurelia - aureliajs,值转换器不更新`&updateTrigger:'blur'`上的值
- verilog - 以下verilog代码的输出将是什么..?
- regex - RegEx 不匹配 PowerShell 中的序列
- mysql - MYSQL 查询以查找类似于连接字符串的字符串