二叉樹遍歷迭代實現
迭代用棧實現:遞迴的原理就是棧,每次呼叫乙個方法就會開闢乙個棧幀,而每個棧幀的返回順序也是按照後進先出的順序。所以基於這個原理,任何遞迴能解決的問題都可以轉換為迭代去實現。
只需記住一點:棧是先進後出。
前序是根-左-右,那麼棧的入棧順序是根(此時進行出棧操作並新增到結果)-右-左;
中序是左-根-右,那麼棧的入棧順序是跟-左(一直到左子結點為空時進行出棧操作並新增到結果)-右(在返回到根);
後序是左-右-根,那麼棧的入棧順序是根-右-左。
首先給出二叉樹的結點定義
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 題目 前序遍歷是中左右的循序,根據棧的先入後出的特點,入棧的順序跟遍歷的順序相反,這樣出棧的時候就可以得到想要的順序。遞迴思路 先樹根,然後左子樹,然後右子樹。每棵子樹遞迴。在迭...