一般遍歷樹的方式有前序遍歷、中序遍歷、後序遍歷以及層序遍歷四種。
順序是相對於根節點而言的,前序遍歷就是根節點在前,左孩子其次,右孩子最後。中序遍歷的順序就是左孩子,根節點,右孩子。後序遍歷順序就是左孩子,右孩子,根節點。層序遍歷則是一層一層的遍歷。除了層序遍歷外,其他三種遍歷方式採用遞迴很容易能寫出來,這裡主要實現這四種遍歷方式的非遞迴實現方法。
非遞迴前序遍歷
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...