BST删除方法异常:删除节点时误删整个子树求助
BST delete方法误删整个子树的问题修复
你的问题出在delete方法的递归返回逻辑上:当处理的不是要删除的目标节点时,方法没有返回当前节点本身,导致递归回溯时父节点的子引用被错误赋值为None,最终丢失整个左子树。
问题分析
以你删除节点1的场景为例:
- 根节点34调用
delete(1),进入data < self.data分支,执行self.left = self.left.delete(1)(此时self.left是节点7)。 - 节点7调用
delete(1),同样进入data < self.data分支,执行self.left = self.left.delete(1)(此时self.left是节点1)。 - 节点1调用
delete(1),进入else分支,因为它有右子节点3,所以返回节点3。节点7的left被正确赋值为3。 - 关键错误:节点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
相关产品推荐
相关产品推荐

