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

二叉搜索树删除根节点报'TreeNode无findSuccessor属性'错误排查

问题排查与修复方案

核心错误原因

你将findSuccessor、findMin、spliceOut三个方法错误定义在了BinarySearchTree类中,但删除逻辑是通过TreeNode实例(也就是currentNode)直接调用这三个方法,TreeNode类本身没有定义这三个方法,自然会抛出AttributeError。
你观察到的“后续插入的节点可正常删除”只是假象:只有当被删除节点同时拥有左右子节点时,才会触发findSuccessor调用,如果后续删除的是叶子节点或只有单个子节点的节点,不会走到对应分支,就不会报错。首次插入的根节点触发报错,刚好是因为它删除时已经存在左右两个子节点,走到了对应调用分支。

修复步骤

  1. 移动方法归属:把findSuccessor、findMin、spliceOut三个方法整体从BinarySearchTree类中剪切,粘贴到TreeNode类的定义内部。
  2. 修正spliceOut方法缩进错误:原spliceOut方法中处理右子节点的分支缩进错误,导致逻辑完全失效,调整后正确的代码如下:
# 该方法属于TreeNode类
def spliceOut(self):
    if self.isLeaf():
        if self.isLeftChild():
            self.parent.leftChild = None
        else:
            self.parent.rightChild = None
    elif self.hasAnyChildren():
        if self.hasLeftChild():
            if self.isLeftChild():
                self.parent.leftChild = self.leftChild
            else:
                self.parent.rightChild = self.leftChild
            self.leftChild.parent = self.parent
        # 原代码此处else缩进错误,与上层elif平级,现在调整为和if self.hasLeftChild()平级
        else:
            if self.isLeftChild():
                self.parent.leftChild = self.rightChild
            else:
                self.parent.rightChild = self.rightChild
            self.rightChild.parent = self.parent
  1. 修正转义字符:代码中所有的&lt;是HTML转义后的小于号,实际运行前需要替换为正常的<,否则会触发语法错误。
    完成以上修改后即可正常删除包含根节点在内的所有符合条件的节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 23:15:03