python 非遞迴遍歷樹

2021-08-20 16:20:49 字數 1600 閱讀 1733

一般遍歷樹的方式有前序遍歷中序遍歷後序遍歷以及層序遍歷四種。

順序是相對於根節點而言的,前序遍歷就是根節點在前,左孩子其次,右孩子最後。中序遍歷的順序就是左孩子,根節點,右孩子。後序遍歷順序就是左孩子,右孩子,根節點。層序遍歷則是一層一層的遍歷。除了層序遍歷外,其他三種遍歷方式採用遞迴很容易能寫出來,這裡主要實現這四種遍歷方式的非遞迴實現方法。

非遞迴前序遍歷

def

preorder

(root):

ifnot root:

return

stack = [root]

res =

while stack:

root = stack.pop()

if root.right:

if root.left:

return res

非遞迴中序遍歷

由於中序遍歷需要最先訪問左孩子,因此需要一直遍歷到左孩子結點為空的結點才進行訪問,然後再訪問右孩子。

def

inorder

(root):

ifnot root:

return

stack =

res =

while stack or root:

while root:

root = root.left

if stack:

root = stack.pop()

root = root.right

return res

非遞迴後序遍歷

後序遍歷如果按很多網上其他的非遞迴遍歷方法,感覺又複雜又難理解,因為後序遍歷的遍歷順序是左孩子,右孩子,最後才是根節點。這裡採用相反的方式,先訪問根節點,再來是右孩子,最後左孩子。這樣遍歷完之後返回遍歷結果的倒序,即是最終的結果。

def

postorder

(root):

ifnot root:

return

stack =

res =

while stack or root:

while root:

root = root.right

if stack:

root = stack.pop()

root = root.left

return res[::-1]

非遞迴層序遍歷

這裡用到佇列,當左孩子存在,則入隊,右孩子存在,入隊,每次取隊首結點。

def

levelorder

(root):

ifnot root:

return

queue = [root]

res =

while queue:

root = queue[0]

queue = queue[1:]

if root.left:

if root.right:

return res

樹的遍歷遞迴非遞迴

1先序 遞迴 class solution public void b list list,treenode tree 非遞迴 class solution else return list 2中序 遞迴 class solution public void b list list,treenode...

樹的非遞迴遍歷

在vs2011版本中除錯通過。include stdafx.h include stack.h include 標準庫中定義的棧 includeusing namespace std define max len 15 void create tree treenode head,char pdat...

樹的非遞迴遍歷

1.中根遍歷 思路 一直遍歷左子樹 p p left 直到p為空。此時訪問棧頂元素,棧頂元素出棧。開始遍歷右子樹p p right 遍歷右子樹的左子樹 出棧時訪問 1.definition for a binary tree node.2.struct treenode 7.class soluti...