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

如何通过类方法更新类属性?Python二叉树self.root赋值失效问题

问题核心诱因
  • 节点对象被错误覆盖:创建newNode = Node(data)后,紧接着写的newNode = newNode.data直接把Node实例替换成了传入的原始数据(整数、字符串等普通类型),这类值没有left/right节点属性。第一次插入时self.root被赋值为这个普通值,后续插入走到分支逻辑尝试访问节点属性时会直接报错,从表现上看就像self.root始终没有被正确赋值为节点对象。
  • 层序插入逻辑失效:while True循环末尾直接写了break,导致每次插入非根节点时,只会取出根节点判断一次就终止循环,根本不会逐层遍历队列找空位,完全实现不了按层插入的效果。
  • 多余的返回值设计:实例方法内直接修改self.xxx属性会直接作用于类实例本身,不需要靠返回值回传属性修改结果。
修复方案

按以下步骤调整代码即可:

  1. 删除错误的newNode = newNode.data行,全程保证newNode是Node类的实例对象
  2. 重写层序遍历的循环逻辑:只有找到空的子节点位置、完成新节点插入后才终止循环,不要在第一次循环就强制跳出
  3. 判空逻辑统一使用is None替代== None,避免自定义类的相等判断方法引发逻辑误差
  4. 补全缺失的Node节点类定义(原代码未给出该类实现,直接运行会报NameError)

修复后的完整可运行代码:

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

class BinaryTree:
    def __init__(self):
        self.root = None

    def InsertNode(self, data):
        newNode = Node(data)

        print('self.root =', self.root)
        print('new node', newNode)

        if self.root is None:
            self.root = newNode
            print('self.root =', self.root)
        else:
            print('else won')
            queue = []
            queue.append(self.root)
            while queue:
                node = queue.pop(0)
                # 优先检查左子节点空位
                if node.left is None:
                    node.left = newNode
                    break
                queue.append(node.left)
                # 左子节点存在则检查右子节点空位
                if node.right is None:
                    node.right = newNode
                    break
                queue.append(node.right)
        return self.root

测试验证代码:

bt = BinaryTree()
bt.InsertNode(1)
bt.InsertNode(2)
bt.InsertNode(3)
print("根节点值:", bt.root.data)
print("根节点左子节点值:", bt.root.left.data)
print("根节点右子节点值:", bt.root.right.data)

运行后可以看到self.root被正确赋值,节点按层序规则依次插入,无属性访问报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:27:18