二叉樹的非遞迴遍歷

2021-09-25 02:04:22 字數 1428 閱讀 3364

二叉樹遞迴遍歷的**實現是非常簡單的,所以很多時候考察乙個人**能力的時候會讓寫乙個二叉樹的非遞迴遍歷。三種實現如下:

先序遍歷

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

defpreorder

(root)

: res =

ifnot root:

return res

stack =

[root]

while stack:

treenode = stack.pop(

)if treenode.right:

if treenode.left:

return res

後序遍歷
# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

defpostorder

(root)

: res =

ifnot root:

return res

stack =

[root]

while stack:

treenode = stack.pop(

)if treenode.left:

if treenode.right:

return res[::

-1]

中序遍歷
# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

definorder

(root)

: res =

ifnot root:

return res

cur = root

stack =

while stack or cur:

while cur:

cur = cur.left

treenode = stack.pop(

) cur = treenode.right

return res

二叉樹的遞迴遍歷是很易懂的,而遞迴就是把函式返回值不斷壓棧,最後到達遞迴出口。非遞迴遍歷演算法就是用乙個顯式的棧模擬這個過程,這裡一定要注意壓棧的順序,因為棧是後進先出的,要明確跟遍歷規則的對應,尤其要注意的是後序遍歷,因為最後返回的結果列表是取反了的。

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...

非遞迴遍歷二叉樹

中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...