Python新建Node实例未更新Tree变量 二叉树插入失效问题
问题核心原因
- Python采用对象引用传递的参数规则,当你给形参
node赋值新的Node实例时,仅修改了当前方法内局部变量的指向,不会同步修改外部传入的原属性(比如根节点self.node、父节点的left/right属性),新创建的节点没有被实际挂载到树结构上。 - 现有递归逻辑没有返回新创建的节点给上层调用方,父节点无法关联到新生成的子节点,且方法返回值为
None,上层调用方无法获取新节点的引用。
举个实际运行场景的例子:首次调用tree.insert(tree.node, 10)时,传入的tree.node是None,形参node拿到的是None的引用,你给node赋值新的Node实例,只是让这个局部变量指向了新对象,tree.node本身没有任何变化,依然是None,自然根节点都不会被更新。
修复方案
可以通过「递归方法返回当前节点,上层调用方将返回值挂载到对应属性」的逻辑修复,修改后代码如下:
class Node(object): # 给left、right加默认值,简化实例化代码 def __init__(self, value, left=None, right=None): self.value = value self.left = left self.right = right class Tree(object): def __init__(self): self.root = None # 更名后语义更清晰 # 对外暴露的插入接口,无需用户手动传入根节点 def insert(self, element): self.root = self._insert_recursive(self.root, element) # 内部递归实现插入逻辑 def _insert_recursive(self, node, element): if node is None: # 直接返回新创建的节点,上层调用方会将其挂载到对应位置 return Node(element) elif element <= node.value: node.left = self._insert_recursive(node.left, element) else: node.right = self._insert_recursive(node.right, element) # 返回当前节点,维持树的结构关联 return node
修改后可以直接通过以下方式调用,插入功能可正常生效:
tree = Tree() tree.insert(5) tree.insert(3) tree.insert(7)
内容的提问来源于stack exchange,提问作者Danial
相关产品推荐
相关产品推荐

