簡體   English   中英

二叉樹迭代中序遍歷

[英]Binary Tree Iterative Inorder Traversal

我正在嘗試實現二叉樹的迭代中序遍歷。

節點.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'

我該如何解決這個錯誤?

stack = nodes = []創建對同一個列表對象的兩個引用。 當您執行stack.append(root)nodes.append(current.node)這會影響stacknodes因為它們是相同的。 你想要的是 2 個不同的對象:

stack = []
nodes = []

然后你會得到這個輸出: [8, 10, 12, 15, 16, 20, 25]

節點變量的值在您的代碼(例如 Node(5))中被初始化為 Int,並且您的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM