You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于含两个子节点的节点删除伪代码的理解困惑

二叉树双子女节点删除算法:困惑部分拆解

咱们先把这段伪代码的前半部分逻辑捋顺,它其实是在给要删除的current节点找中序后继节点——也就是你要删的节点右子树里最靠左(值最小)的那个节点。为啥找它?因为这个后继节点最多只有一个右子节点(毕竟它已经是右子树里最左的了,不可能有左孩子),这样后续删除操作会非常简单。

先拆解前半段代码的执行流程:

  • temp = current + tempParent = temp:先让temp和它的父指针都指向要删除的节点
  • temp = temp.right:跳到要删除节点的右子树,开始找后继
  • while(temp.left != null):只要temp还有左孩子,就一直往左走,同时让tempParent跟着temp移动,直到temp没有左孩子为止。这时候的temp就是我们要找的后继节点,tempParent是它的父节点。

接下来就是你困惑的核心部分:找到后继后,怎么把它从树里“摘”出来,同时完成对current节点的替换。这里要分两种场景处理:

场景1:后继节点就是current的直接右孩子

也就是循环根本没执行——temp一开始是current.right,而且它本身没有左孩子。这时候tempParent还是current,我们需要做:

  1. 先把temp的值复制给current(这步伪代码没写,但实际是核心操作,相当于用后继的值“替换”要删除的节点)
  2. 然后执行 tempParent.right = temp.right:把temp的右子节点直接接到current的右位置上,相当于把temp从树里移除(因为它的值已经转移到current了)

场景2:后继节点是current右子树里某个节点的左孩子

也就是循环至少执行了一次——temp是某个节点的左孩子,这时候tempParent是temp的父节点,我们需要:

  1. 同样先把temp的值复制给current
  2. 然后执行 tempParent.left = temp.right:把temp的右子节点接到tempParent的左位置上,这样temp就被从树里移除了,它的右孩子顶替了它的位置

举个直观的例子:
假设current是值为5的节点,它的右子节点是6,6的左子节点是5.5(这个5.5就是我们要找的后继,没有左孩子)。那执行完前半段循环后,temp是5.5,tempParent是6。这时候我们把5.5的值复制给5,然后让6的左指针指向5.5的右孩子(如果有的话),这样树的结构就完全正确了——原来的5节点现在是5.5的值,而5.5这个节点被成功删除。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:29:58