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

编写二叉搜索树时出现'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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:07:43