You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

红黑树插入平衡疑问:按指定Insert-Fixup步骤执行是否正确?

红黑树插入修复的问题解答

首先直接回应你的核心疑问:你执行左旋转后的结果是正确的!结合插入序列2→1→4→5→9的修复流程,当处理节点5(z)时,因为它是父节点(4)的右孩子,执行LEFT-ROTATE(T, z.p)也就是对节点4左旋转后,树的结构完全符合红黑树左旋转的定义——节点5成为祖父节点(2)的右孩子,节点4变成5的左孩子,这一步的结构调整没问题。

接下来聊你提到的双旋转和单旋转的疑问:你贴的这段算法片段本身就是**双旋转(先左后右)**的标准实现,并不是单旋转逻辑。我们把这段代码拆解来看:

if z == z.p.right 
    z = z.p 
    LEFT-ROTATE (T, z) 
z.p.color = BLACK 
z.p.p.color = RED 
RIGHT-ROTATE (T, z.p.p)

这对应红黑树插入修复中的「叔节点为黑色,且z是右孩子」的情形:先通过左旋转把问题转化为z是左孩子的场景,再通过右旋转完成最终的平衡调整,整个流程就是双旋转的应用,不存在“用双旋转替代单旋转”的说法——这里本来就需要双旋转来修复红黑树性质。

最后说你困惑的「对值为4的节点执行右旋」:右旋的核心逻辑是将目标节点的左孩子提升为父节点,目标节点自身变为该左孩子的右孩子,同时维护所有父/子指针的关联。如果单独对值为4的节点(假设此时它的父节点是2,左孩子是1)执行右旋,操作后会变成:

  • 节点1成为节点2的右孩子(替代原来4的位置)
  • 节点4的左孩子变为节点1原来的右孩子(这里1没有右孩子,所以为空)
  • 节点1的右孩子变为节点4
  • 同步更新节点4的父指针指向节点1

不过回到你的当前场景,算法中要求执行右旋的对象是z.p.p(也就是值为2的节点),而不是4。这一步右旋是为了调整树的高度,同时配合颜色修改(z.p设为黑,z.p.p设为红),让树重新满足红黑树的5条性质。

总的来说,你当前的左旋转操作是正确的,这段修复算法本身就是双旋转的实现,而你需要执行的右旋对象是节点2,不是节点4哦。

内容的提问来源于stack exchange,提问作者JimBelushi2

火山引擎 最新活动