关于含两个子节点的节点删除伪代码的理解困惑
二叉树双子女节点删除算法:困惑部分拆解
咱们先把这段伪代码的前半部分逻辑捋顺,它其实是在给要删除的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,我们需要做:
- 先把
temp的值复制给current(这步伪代码没写,但实际是核心操作,相当于用后继的值“替换”要删除的节点) - 然后执行
tempParent.right = temp.right:把temp的右子节点直接接到current的右位置上,相当于把temp从树里移除(因为它的值已经转移到current了)
场景2:后继节点是current右子树里某个节点的左孩子
也就是循环至少执行了一次——temp是某个节点的左孩子,这时候tempParent是temp的父节点,我们需要:
- 同样先把
temp的值复制给current - 然后执行
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
相关产品推荐
相关产品推荐

