最近做題的時候經常碰見二叉樹的題,這次來個完整的遍歷順序,一勞永逸
遍歷的方法有:層序遍歷、先序遍歷、中序遍歷、後序遍歷等,以下面的二叉樹為例介紹遍歷e/ \
b f
/ \ \
a d h
/ / \
c g i\k
/j1.層序遍歷
即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。
例子中層序遍歷為ebfadhcgikj,一層一層從上往下,從左往右輸出。
2.先序遍歷
遍歷順序是 先根再左子樹再右子樹,訪問根結點的操作發生在遍歷其左右子樹之前。
我們看例子,首先從根節點e開始,先根輸出e,然後左子樹b,此時的位置在b,b相當於ad兩個結點的根,所以遍歷b之後,遍歷b的左子樹a,a沒有孩子結點,所以遍歷b的右子樹d,d有左子樹遍歷c,這樣完成了e的左子樹遍歷,再遍歷e的右子樹f,再遍歷f的左子樹,這裡沒有,就遍歷f的右子樹h,然後再遍歷h的左右子樹,左子樹g,當然g沒有孩子結點,所以接下來是i,然後 k j類似。
所以先序遍歷是ebadcfhgikj,記住一點,訪問根結點的操作發生在遍歷其左右子樹之前,在上面的例子中,訪問完e之後訪問b,接下來不是訪問f,而是訪問b的左右子樹。
3.中序遍歷
先左子樹再根再右子樹
a/ \
b c
中序遍歷就是 b a c,如果b有左右子樹,如下圖,再訪問b之前先訪問b的左子樹
a/ \
b c
/ \
d e
中序遍歷為 d b e a c,如果c有右子樹沒有左子樹,如下圖則是先訪問c再訪問f
a/ \
b c
/ \ \
d e f
最上面提到的例子
e/ \
b f
/ \ \
a d h
/ / \
c g i\k
/j中序就是:abcdefghijk,在訪問e的時候,發現e有左子樹b,先b,再訪問b的時候發現有左子樹a,所以肯定還是a先,所以這個序列是從a開始的。
3.後序遍歷
其訪問順序是先左再右再根,下面的例子,後序就是bca
a/ \
b c
如果b有左右子樹,如下圖,先訪問b的左右子樹,再訪問b,其後序是debca
a/ \
b c
/ \
d e
如果c有右子樹沒有左子樹有右子樹,再訪問c時的右子樹f再訪問c,其後序是debfca
a/ \
b c
/ \ \
d e f
最開始提到的例子
e/ \
b f
/ \ \
a d h
/ / \
c g i\k
/j後序是acdbgjkihfe
重建二叉樹 前中遍歷 後中遍歷
乙個二叉樹的遍歷序列不能決定一棵二叉樹,但某些不同的遍歷序列組合可以唯一確定一棵二叉樹。給定一棵二叉樹的前序遍歷序列和中序遍歷序列可以唯一確定一棵二叉樹的結構,給定一棵二叉樹的後序遍歷序列和中序遍歷序列也可以唯一確定一棵二叉樹的結構。注意 這還有乙個條件 二叉樹的任意兩個結點的值都不相同。一.根據前...
二叉樹 前中後 非遞迴遍歷
非遞迴遍歷就是迭代遍歷 模擬的就是遞迴中的過程,比遞迴略微複雜 非遞迴前序遍歷 public static void prordernor treenode root 獲取棧頂元素 curnode st.pop 訪問棧頂元素的右子樹 curnode curnode.right system.out....
二叉樹前中後序遍歷
前序遍歷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,請還原這顆二叉樹。思...