1. 二叉樹的遍歷
遍歷定義 ——順著某一條搜尋路徑巡訪二叉樹中的結點,使得 每個結點均被訪問一次,而且僅被訪問一次。
「訪問」的含義可以很廣,如:輸出結點的資訊等。
遍歷用途——查詢具有某種特徵的結點;對樹中全部結點逐一進行某種處理。遍歷是二叉樹一切運算的基礎和核心。
遍歷規則
二叉樹由根、左子樹、右子樹構成,定義為d、 l、r
d、 l、r的組合定義了六種可能的遍歷方案: ldr, lrd, dlr, drl, rdl, rld
若限定先左後右,則有三種實現方案: dlr ldr lrd
先 (根)序遍歷 中 (根)序遍歷 後(根)序遍歷
注:「先、中、後」的意思是指訪問的結點d是先於子樹出現還是後於子樹出現。
討論:若已知先序/後序遍歷結果和中序遍歷結果, 能否「恢復」出二叉樹?
例如: 已知一棵二叉樹的中序序列和後序序列分別是bdceafhg 和 decbhgfa,請畫出這棵二叉樹。
分析:
①由後序遍歷特徵,根結點必在後序序列尾部(即a);
②由中序遍歷特徵,根結點必在其中間,而且其左部必全部是左子樹子孫(即bdce),其右部必全部是右子樹子孫(即 fhg);
③繼而,根據後序中的decb子樹可確定b為a的左孩子,根據hgf子串可確定f為a的右孩子;以此類推。
例如:
已知一棵二叉樹的前序遍歷序列和中序遍歷序列分別為abcdefghi 和bcaedghfi,如何構造該二叉樹呢?
解題步驟:
二叉樹遍歷演算法的遞迴實現:
對遍歷的分析:
1. 從前面的三種遍歷演算法可以知道:如果將printf語句抹去,從遞迴的角度看,這三種演算法是完全相同的,或者說這三種遍歷演算法的訪問路徑是相同的,只是訪問結點的時機不同。
從虛線的出發點到終點的路徑 上,每個結點經過3次。
第1次經過時訪問=先序遍歷
第2次經過時訪問=中序遍歷
第3次經過時訪問=後序遍歷
2. 二叉樹遍歷的時間效率和空間效率
時間效率:o(n) //每個結點只訪問一次
空間效率:o(n) //棧占用的最大輔助空間
(精確值:樹深為k的遞迴遍歷需要k+1個輔助單元!最壞情況深度為n,所以空間複雜度為o(n))
二叉樹遍歷演算法的非遞迴實現
演算法思路:若不用遞迴,則要實現二叉樹遍歷的「巢狀」規則,必用堆疊。
二叉樹遍歷演算法的應用舉例
例1 統計二叉樹中葉子結點的個數
思路:輸出葉子結點比較簡單,用任何一種遍歷演算法,凡是左右指標均空者,則為葉子,將其統計並列印出來。
二叉樹遍歷演算法的應用舉例
例1 統計二叉樹中葉子結點的個數
思路:輸出葉子結點比較簡單,用任何一種遍歷演算法,凡是左右指標均空者,則為葉子,將其統計並列印出來。
例3 求二叉樹的深度
演算法思路:
只查各結點後繼鍊錶指標,若左(右)孩子的左(右)指標非空,則層次數加1;否則函式返回。
當t= null時,深度為0;
否則, t的深度= max+1;
例4 按層次輸出二叉樹中的所有結點
演算法思路:既然要求從上到下,從左到右,則利用佇列存放各子樹結點的指標是個好辦法,而不必拘泥於遞迴演算法。
技巧:當根結點入隊後,根據其左右孩子指標域令其左、右孩子結點入隊,然後根節點出隊; 而之後根結點以外的結點出隊時又令它的左右孩子結點入隊,……由此便可產生按層次輸出的效果。
例5 判斷二叉樹是否為完全二叉樹
演算法思路:完全二叉樹的特點是:沒有左子樹空而右子樹單獨存在的情況(前k-1層都是滿的,且第k層左邊也滿)。
技巧: 按層序遍歷方式,先把所有結點(不管當前結 點是否有左右孩子)都入佇列.若為完全二叉樹, 則層序遍歷時得到的肯定是乙個連續的不包含空指標的序列.如果序列中出現了空指標,則說明不是完全二叉樹。
用二叉鍊錶法(l_child, r_child)儲存包含n個結點的 二叉樹,結點的指標區域中會有n+1個空指標。
構建二叉樹 遍歷二叉樹
陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...
二叉樹遍歷
二叉樹的遍歷非常重要,但對已一棵比較複雜的樹,要寫出它的先 中 後序遍歷,往往不是那麼簡單,也很容易犯錯。這裡介紹一種比較直觀且不容易犯錯的方法。對於圖1所示的二叉樹,要寫出它的先 中 後序遍歷,往往很容易出錯。圖 1 其實,我們可以用圖2中的紅線描畫出二叉樹的輪廓。圖 2 而對於樹上的每乙個節點,...
二叉樹遍歷
描述 華為實習生招聘,有一道類似如下的題目 給出二叉樹,如圖1所示 圖 1 二叉樹 要求給出中序遍歷的結果。下面分別就前序遍歷 中序遍歷 後序遍歷進行分析。規律 前序遍歷 根在前 子樹在根後且左子樹比右子樹靠前 中序遍歷 根在中 左子樹在根左邊,右子樹在根右邊 後序遍歷 根在後 子樹在根前且左子樹比...