如何修复列表转BST时Tree对象值丢失问题?
问题修复方案
以下是针对你代码问题的修复,同时保留convert作为Tree类方法:
核心问题分析
insert方法未定义为静态方法:直接通过Tree.insert()调用时,Python会将其视为实例方法并期望self参数,导致参数错误。convert方法中重新赋值self无效:在方法内对self的赋值只会修改局部变量,不会改变原始调用实例的属性。- 未接收
convert方法的返回值:原代码中convert返回了新构建的树,但未将其赋值回tree变量,导致原始空实例未被更新。
修复版本1:修改当前实例属性
此版本让convert直接修改调用它的实例,无需重新赋值:
class Tree: def __init__(self, key=None): self.left = None self.right = None self.key = key @staticmethod def insert(key): return Tree(key) def convert(self, lst): # 清空当前节点初始值 self.key = None self.left = self.right = None if not lst: return self mid = len(lst) // 2 # 设置当前节点的key为列表中间元素 self.key = lst[mid] # 构建左子树(如果左侧有元素) if mid > 0: self.left = Tree().convert(lst[:mid]) # 构建右子树(如果右侧有元素) if len(lst) > mid + 1: self.right = Tree().convert(lst[mid+1:]) return self # 测试代码 int_list = [1,2,3] tree = Tree() tree.convert(int_list) print(tree.key) # 输出:2 print(tree.left.key) # 输出:1 print(tree.right.key)# 输出:3
修复版本2:返回新树实例
此版本保留convert返回新树的逻辑,需将返回值赋值回变量:
class Tree: def __init__(self, key=None): self.left = None self.right = None self.key = key @staticmethod def insert(key): return Tree(key) def convert(self, lst): if not lst: return None mid = len(lst) // 2 root = Tree.insert(lst[mid]) root.left = Tree().convert(lst[:mid]) root.right = Tree().convert(lst[mid+1:]) return root # 测试代码 int_list = [1,2,3] tree = Tree() tree = tree.convert(int_list) # 将返回的新树赋值回tree变量 print(tree.key) # 输出:2 print(tree.left.key) # 输出:1 print(tree.right.key)# 输出:3
内容的提问来源于stack exchange,提问作者Amaan
相关产品推荐
相关产品推荐

