二叉搜索树(BST)删除方法失效求助:递归实现后无法删除节点
解决二叉搜索树递归删除方法失效的问题
嘿,我看到你的问题了——调用delete方法后节点没被删掉,确实是代码里有个关键的小错误,咱们一步步来捋清楚:
核心问题:递归调用时未使用类实例引用
在处理节点同时存在左右子树的分支中,你最后一行删除后继节点的代码写错了:
node.right = delete(node.right,delete.data)
这里没有用self.来调用类的delete方法,相当于你试图调用一个全局的delete函数(而不是你定义的类成员方法),这一步的递归删除根本没执行,导致后继节点还留在树上,看起来就像目标节点没被删掉一样。
其他细节优化(不影响功能,但更简洁)
除了这个核心错误,你的代码还有几个可以简化的地方:
- 处理单孩子节点时,不需要先给
node赋值再return,直接返回子节点即可 - 变量名
delete和方法名重复了,容易混淆,建议改成successor(后继节点)
修正后的完整代码
def delete(self, node, val): if node is None: return None if val < node.data: node.left = self.delete(node.left, val) elif val > node.data: node.right = self.delete(node.right, val) else: # 情况1:叶子节点,直接删除 if node.left is None and node.right is None: return None # 情况2:只有右孩子 elif node.left is None: return node.right # 情况3:只有左孩子 elif node.right is None: return node.left # 情况4:有两个孩子,找右子树的最小节点(后继) else: successor = node.right while successor.left: successor = successor.left # 替换当前节点的值为后继的值 node.data = successor.data # 递归删除后继节点(注意这里要加self.) node.right = self.delete(node.right, successor.data) return node # 把处理后的节点返回给父节点,确保树结构正确更新 # 调用测试 testTree.delete(testTree.root, 30) testTree.printInorder(testTree.root)
验证逻辑
修正后,当删除有两个子树的节点时:
- 找到右子树的最小节点(后继)
- 将当前节点的值替换为后继的值
- 通过
self.delete递归删除后继节点,这一步会正确修改右子树的结构,把后继节点从树上移除 - 最终父节点的指针会接收到处理后的节点,树的结构就正确更新了
内容的提问来源于stack exchange,提问作者anon anon
相关产品推荐
相关产品推荐

