【问题标题】:How can I make my Binary Tree's search/traversal method work?如何使二叉树的搜索/遍历方法起作用?
【发布时间】:2021-02-19 12:07:13
【问题描述】:

我最近刚刚完成了自己的二叉树实现,我认为这对于第一次尝试来说效果很好。我可以很容易地将左右子节点添加到根节点,查看节点的值,以及验证某个节点是否是子节点。

但是,我的搜索功能确实存在问题,该功能需要预订遍历系统。在我的 IDE 中,使用像这样的二叉树:

尝试使用我的搜索功能时常返回错误“AttributeError: 'int' object has no attribute 'data'”,我不太清楚它的含义。在我的代码中:

def search(self, value):
    def find(x):
        if x.data is not False:
            return True

    val2 = self.traverse_pre_order(find)
    if val2 is not True:
        return False
    else:
        return True

我试图将 x.data 更改为简单的 x,但这会返回 AttributeError 'NoneType' object has no attribute 'traverse_pre_order'

我附上了与我正在研究的二叉树相关的PasteBin with my full code 的链接。

【问题讨论】:

    标签: python binary-tree tree-traversal


    【解决方案1】:

    您的代码存在一些问题:

    • 您在类定义的正下方定义了一些变量(value、left_child、right_child),但从不使用它们。

    • 清楚地考虑每种方法应该做什么。您的traverse_pre_order 函数不返回任何内容,因此search 函数中的val2 中没有存储任何内容。

    你得到错误

    1. 因为你基本上是调用find(Node.data),然后 find 函数会尝试执行data.data(不存在)

    2. 因为最后有一个带有left=None 的节点,而您尝试调用left.traverse_pre_order()。您应该检查left not None 而不是使用hasattr

    【讨论】:

      【解决方案2】:

      首先,x.data 应该更改为 x,因为您使用的是 visit(self.data)。您的输入已经是self.data,所以x 将是self.datax.data 将等于self.data.data,这没有意义。

      其次,您应该更改traverse_pre_order 中的递归条件。 它应该是if self.left is not None: 而不是if hasattr(self, 'left'):。您不想检查self.left 是否存在(因为它会一直存在,因为您在__init__ 中对其进行了初始化)。相反,您应该检查它是否是None

      您的traverse_pre_ordersearch 的结构也存在明显错误,但我想您可以先尝试自己解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-09
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多