如何通过类方法更新类属性?Python二叉树self.root赋值失效问题
问题核心诱因
- 节点对象被错误覆盖:创建
newNode = Node(data)后,紧接着写的newNode = newNode.data直接把Node实例替换成了传入的原始数据(整数、字符串等普通类型),这类值没有left/right节点属性。第一次插入时self.root被赋值为这个普通值,后续插入走到分支逻辑尝试访问节点属性时会直接报错,从表现上看就像self.root始终没有被正确赋值为节点对象。 - 层序插入逻辑失效:
while True循环末尾直接写了break,导致每次插入非根节点时,只会取出根节点判断一次就终止循环,根本不会逐层遍历队列找空位,完全实现不了按层插入的效果。 - 多余的返回值设计:实例方法内直接修改
self.xxx属性会直接作用于类实例本身,不需要靠返回值回传属性修改结果。
修复方案
按以下步骤调整代码即可:
- 删除错误的
newNode = newNode.data行,全程保证newNode是Node类的实例对象 - 重写层序遍历的循环逻辑:只有找到空的子节点位置、完成新节点插入后才终止循环,不要在第一次循环就强制跳出
- 判空逻辑统一使用
is None替代== None,避免自定义类的相等判断方法引发逻辑误差 - 补全缺失的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
相关产品推荐
相关产品推荐

