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

BST删除方法异常:删除节点时误删整个子树求助

BST delete方法误删整个子树的问题修复

你的问题出在delete方法的递归返回逻辑上:当处理的不是要删除的目标节点时,方法没有返回当前节点本身,导致递归回溯时父节点的子引用被错误赋值为None,最终丢失整个左子树。

问题分析

以你删除节点1的场景为例:

  1. 根节点34调用delete(1),进入data < self.data分支,执行self.left = self.left.delete(1)(此时self.left是节点7)。
  2. 节点7调用delete(1),同样进入data < self.data分支,执行self.left = self.left.delete(1)(此时self.left是节点1)。
  3. 节点1调用delete(1),进入else分支,因为它有右子节点3,所以返回节点3。节点7的left被正确赋值为3。
  4. 关键错误:节点7的delete方法执行完后没有返回值(默认返回None),导致根节点34的left被赋值为None,直接丢失了整个左子树。

修复方案

在delete方法的末尾添加return self,确保所有非目标节点的递归调用都能返回当前节点,让父节点正确维护子引用:

def delete(self, data):
    if data < self.data:
        if self.left:
            self.left = self.left.delete(data)
    elif data > self.data:
        if self.right:
            self.right = self.right.delete(data)
    else:
        if self.left is None and self.right is None:
            return None
        elif self.left is None:
            return self.right
        elif self.right is None:
            return self.left

        minval = self.right.findmin()
        self.data = minval
        self.right = self.right.delete(minval)
    # 添加此行,返回当前节点
    return self

测试结果

修改后执行你的测试用例,第二个print语句的输出会变为:
[3, 4, 5, 7, 8, 10, 34, 65, 98, 100, 203]
符合预期,仅删除了节点1,其余左子树结构完整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:18:19