【问题标题】:Binary Tree Iterative Inorder Traversal二叉树迭代中序遍历
【发布时间】:2020-11-02 09:58:53
【问题描述】:

我正在尝试实现二叉树的迭代中序遍历。

node.py:

class Node:
    def __init__(self, node=None, left=None, right=None):
        self.node  = node
        self.left  = left
        self.right = right

inorder_traversal.py:

from node import Node

def in_order(root):
    stack = nodes = []
    while stack or root:
        if root:
            stack.append(root)
            root = root.left
        else:
            current = stack.pop()
            nodes.append(current.node)
            root = current.right
    return nodes


def main():
    '''
    Construct the below binary tree:

            15
           /  \
          /    \
         /      \
        10      20
       /  \    /  \
      8   12  16  25

    '''
    root = Node(15)
    root.left  = Node(10)
    root.right = Node(20)
    root.left.left  = Node(8)
    root.left.right = Node(12)
    root.right.left  = Node(16)
    root.right.right = Node(25)

    print(in_order(root))

if __name__ == '__main__':
    main()

我得到了:AttributeError: 'int' object has no attribute 'node'

我该如何解决这个错误?

【问题讨论】:

  • 请提供预期的MRE。显示中间结果与预期结果的偏差。我们应该能够将您的代码块粘贴到文件中,运行它并重现您的问题。这也让我们可以在您的上下文中测试任何建议。给出整个错误消息,包括堆栈跟踪。我们还希望您在错误点之前跟踪有问题的值。您对他们如何达到这些价值观感到困惑?
  • @Prune 这里给出的例子对我来说似乎很小并且可以重现......
  • @Prune 抱歉,我刚刚在第二个代码块中添加了 import 语句。堆栈跟踪中有 3 行,如果完全添加,我觉得这是不必要的。

标签: python algorithm binary-tree tree-traversal


【解决方案1】:

stack = nodes = [] 创建对同一个列表对象的两个引用。 当您执行stack.append(root)nodes.append(current.node) 时,这会同时影响stacknodes,因为它们是相同的。你想要的是 2 个不同的对象:

stack = []
nodes = []

然后你会得到这个输出:[8, 10, 12, 15, 16, 20, 25]

【讨论】:

    【解决方案2】:

    节点变量的值在您的代码中初始化为 Int(例如 Node(5)),并且您的 in_order 方法将该值压入堆栈,然后将其弹出并尝试访问其节点变量,这将导致错误。

    这是一个没有该错误并使用递归进行顺序遍历的实现(这可以更简单地遵循)。

    class Node:
        def __init__(self, value, left=None, right=None):
            self.value  = value
            self.left  = left
            self.right = right
    
    def in_order(node):
        nodes = []
        if node.left:
          nodes.extend(in_order(node.left))
        nodes.append(node.value)
        if node.right:
          nodes.extend(in_order(node.right))
        return nodes
    

    【讨论】:

    • 我试图实现一个迭代解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2020-01-15
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多