遍歷二叉樹

2021-07-12 05:39:45 字數 2941 閱讀 5558

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 二叉樹 要求給出中序遍歷的結果。下面分別就前序遍歷 中序遍歷 後序遍歷進行分析。規律 前序遍歷 根在前 子樹在根後且左子樹比右子樹靠前 中序遍歷 根在中 左子樹在根左邊,右子樹在根右邊 後序遍歷 根在後 子樹在根前且左子樹比...