二叉樹前中後序遍歷迭代實現

2021-10-10 00:24:57 字數 1426 閱讀 4363

二叉樹遍歷迭代實現

迭代用棧實現:遞迴的原理就是棧,每次呼叫乙個方法就會開闢乙個棧幀,而每個棧幀的返回順序也是按照後進先出的順序。所以基於這個原理,任何遞迴能解決的問題都可以轉換為迭代去實現。

只需記住一點:棧是先進後出。

前序是根-左-右,那麼棧的入棧順序是根(此時進行出棧操作並新增到結果)-右-左;

中序是左-根-右,那麼棧的入棧順序是跟-左(一直到左子結點為空時進行出棧操作並新增到結果)-右(在返回到根);

後序是左-右-根,那麼棧的入棧順序是根-右-左。

首先給出二叉樹的結點定義

public

class

treenode

treenode

(int val)

treenode

(int val, treenode left, treenode right)

}

前序遍歷:

前序遍歷是中左右,每次先處理的是中間節點,那麼先將跟節點放入棧中,然後將右孩子加入棧,再加入左孩子。

為什麼要先加入 右孩子,再加入左孩子呢?因為這樣出棧的時候才是中左右的順序。

class

solution

return res;

}}

中序遍歷:

class

solution

root=stack.

pop();

res.

add(root.val)

; root=root.right;

}return res;

}}

後序遍歷

方法1:

class

solution

if(node.right!=null)

}return res;

}}

方法2來自力扣官方題解

class

solution

deque

stack =

newlinkedlist

(); treenode prev = null;

while

(root != null ||

!stack.

isempty()

) root = stack.

pop();

if(root.right == null || root.right == prev)

else

}return res;

}}

二叉樹前中後序遍歷

前序遍歷a b d f g h i e c 中序遍歷f d h g i b e a c 後序遍歷f h i g d e b c a 前序 根左右 中序 左根右 後序 左右根 已知某二叉樹的前序遍歷為a b d f g h i e c,中序遍歷為f d h g i b e a c,請還原這顆二叉樹。思...

二叉樹前中後序遍歷

二叉樹 6.先序遍歷 10分 請編寫遞迴函式,實現二叉樹的先序遍歷。函式原型 先序遍歷 void bintreepreorder const tnode root 說明 root為二叉樹或子樹的根指標。在標頭檔案 bintree.h 新增函式宣告。bintree.h 先序遍歷 void bintre...

迭代法求二叉樹前中後序遍歷

遞迴法求解三種遍歷方式是十分簡單的,但迭代法卻不太簡單,本文給出幾種方式和模板。節點型別 struct treenode 題目 前序遍歷是中左右的循序,根據棧的先入後出的特點,入棧的順序跟遍歷的順序相反,這樣出棧的時候就可以得到想要的順序。遞迴思路 先樹根,然後左子樹,然後右子樹。每棵子樹遞迴。在迭...