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

二叉搜索树(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)

验证逻辑

修正后,当删除有两个子树的节点时:

  1. 找到右子树的最小节点(后继)
  2. 将当前节点的值替换为后继的值
  3. 通过self.delete递归删除后继节点,这一步会正确修改右子树的结构,把后继节点从树上移除
  4. 最终父节点的指针会接收到处理后的节点,树的结构就正确更新了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:03:40