编写二叉搜索树时出现'int'对象无'value'属性错误求助
问题分析与解决方案
嘿,我来帮你搞定这个二叉搜索树的问题!你遇到的AttributeError: 'int' object has no attribute 'value'错误,根源其实很明确,咱们一步步拆解:
核心错误:Root节点初始化错误
在你的insert方法里,当self.root为空时,你直接把整数value赋值给了self.root,而不是创建一个node类的实例!这就导致第一次插入后,self.root是一个整数,而不是预期的node对象。第二次调用insert时,_insert方法会把这个整数当作cur_node,尝试访问它的.value属性,自然就报错了。
修正后的insert方法:
def insert(self, value): if self.root == None: self.root = node(value) # 关键:创建node实例,而非直接赋值整数 else: self._insert(value, self.root)
其他隐藏错误(修正后才能正常运行)
除了核心错误,代码里还有几个小问题会导致后续运行报错或结果不正确,一起修正掉:
1. height方法的逻辑问题
- 原
height方法没有返回_height的计算结果 - 调用
_height时遗漏了self.(因为是实例方法) - 递归计算高度时没有递增
cur_height,导致高度计算错误
修正后的代码:
def height(self): if self.root != None: return self._height(self.root, 0) # 返回计算结果 else: return 0 def _height(self, cur_node, cur_height): if cur_node == None: return cur_height left = self._height(cur_node.left_child, cur_height + 1) # 加self.,并递增高度 right = self._height(cur_node.right_child, cur_height + 1) return max(left, right)
2. search方法的拼写与逻辑错误
- 条件判断里
value>cur_node应该是value>cur_node.value cur_node.rightchild拼写错误,应为cur_node.right_child- 原
search方法没有返回_search的结果,调用时拿不到返回值
修正后的代码:
def search(self, value): if self.root != None: return self._search(self.root, value) # 返回搜索结果 else: return 0 def _search(self, cur_node, value): if cur_node.value == value: return 1 elif value < cur_node.value and cur_node.left_child != None: return self._search(cur_node.left_child, value) elif value > cur_node.value and cur_node.right_child != None: # 修正拼写和判断逻辑 return self._search(cur_node.right_child, value) return 0
3. _print_tree方法的递归边界问题
原方法没有判断cur_node是否为None,递归到叶子节点的子节点时会报错,需要先做判断:
def _print_tree(self, cur_node): if cur_node != None: # 先判断节点是否存在,再递归 self._print_tree(cur_node.left_child) print(str(cur_node.value)) self._print_tree(cur_node.right_child)
修正后的完整代码
class node: def __init__(self, value=None): self.value = value self.left_child = None self.right_child = None class binary_search_tree: def __init__(self): self.root = None def insert(self, value): if self.root == None: self.root = node(value) else: self._insert(value, self.root) def _insert(self, value, cur_node): if value < cur_node.value: if cur_node.left_child == None: cur_node.left_child = node(value) else: self._insert(value, cur_node.left_child) elif value > cur_node.value: if cur_node.right_child == None: cur_node.right_child = node(value) else: self._insert(value, cur_node.right_child) else: print("Value already in tree") def print_tree(self): if self.root != None: self._print_tree(self.root) def _print_tree(self, cur_node): if cur_node != None: self._print_tree(cur_node.left_child) print(str(cur_node.value)) self._print_tree(cur_node.right_child) def height(self): if self.root != None: return self._height(self.root, 0) else: return 0 def _height(self, cur_node, cur_height): if cur_node == None: return cur_height left = self._height(cur_node.left_child, cur_height + 1) right = self._height(cur_node.right_child, cur_height + 1) return max(left, right) def search(self, value): if self.root != None: return self._search(self.root, value) else: return 0 def _search(self, cur_node, value): if cur_node.value == value: return 1 elif value < cur_node.value and cur_node.left_child != None: return self._search(cur_node.left_child, value) elif value > cur_node.value and cur_node.right_child != None: return self._search(cur_node.right_child, value) return 0 tree = binary_search_tree() tree.insert(6) tree.insert(8) tree.insert(3) tree.insert(17) tree.insert(1) tree.insert(4) tree.print_tree() print("Tree height:", tree.height()) print("Search 5:", tree.search(5)) print("Search 6:", tree.search(6))
现在运行这段代码,就能正常执行,不会再出现之前的错误啦!
内容的提问来源于stack exchange,提问作者Suprateem Banerjee
相关产品推荐
相关产品推荐

