1. 程式人生 > >【資料結構筆記】三、樹與二叉樹

【資料結構筆記】三、樹與二叉樹

課程是中國大學MOOC浙江大學出的資料結構。
作為一個數據結構愛好者,我覺得很有必要稍微整理下各章節的筆記,對知識進行梳理。
查詢
首先,老師從“查詢”入手,查詢分為靜態和動態,演示了靜態查詢的例程,並介紹了‘建立哨兵’的思想。而這個例程使用的是普通的順序查詢,因為其低效性,我們又引入了二分查詢(Binary Search)
二分查詢
條件有二:①本身是有序的②在數組裡實現。他的時間複雜度比順序查詢縮短了不少。讀者們可以自己算一下~然後,從二分查詢引出了二分查詢判定樹,層次即為最壞情況比較次數[log2n]+1,ASL平均成功查詢次數。
成功過渡到樹,終於進入了主題。容易混淆的幾個概念,結點的度,樹的度,葉節點,樹的深度,其他都還好。概念介紹完,怎麼實現樹呢?陣列?對任意的樹結構來說,難度太大,我們往往用連結串列來儲存。隨之而來的,有2個問題:①結點型別不統一,②若強行使之統一,則會造成較多浪費。解決辦法:提出兒子-兄弟表示法

。其優點便是是結構統一,但造成的浪費較少,可以計算浪費為2N-(N-1),其中N-1是N個結點固定的邊數。有趣的是,我們把兒子-兄弟表示樹旋轉45°,便得到一個度為2的二叉樹,接下來進入到二叉樹的部分。
二叉樹
度為2,但是有左右之分。它有五種基本形態,並介紹了三種特殊二叉樹:斜二叉樹、完美(滿)二叉樹、完全二叉樹。二叉樹第i層最多2exp{i-1}個節點,深度為k的二叉樹最多2exp{k}-1個結點。記葉結點為N0,兩個兒子的結點為N2,他們滿足個關係式:N0=N2+1,可自證。
二叉樹的操作
判空、遍歷、建立等。其中遍歷尤其重要,後面介紹了4種遍歷方法;前中後序+層次遍歷。
順序儲存結構

二叉樹不同於樹,他的儲存結構可以用陣列存放,即順序儲存結構的實現。但一般針對於完全二叉樹,普通二叉樹則會造成大量空間浪費。遍歷過程中,完全二叉樹非跟結點的父結點為下取整i/2,任意結點的左兒子是2i,因此可以快速訪問任意結點。
連結串列儲存方法
除了一個data位置存放資料,分為兩個指標,分別指向左右子樹。
三種遞迴遍歷方法
的具體程式編寫。總結為:路徑實際上都相同,每個結點都訪問了三次,只是訪問各結點的實際不同。最後講了遍歷的非遞迴的演算法,實際上是用堆疊來實現遞迴操作,以中序非遍歷來實現是最簡單的,稍微改動便能改為先序,而後序則難了許多,需要課外去思考下。
第四種遍歷演算法
層次遍歷
。二叉樹的遍歷實際上是資料從二維到一維的轉化。前面通過用堆疊(先儲存自己)實現了這個轉化,下面我們用佇列(先儲存左右兒子)也可實現,而佇列實現的遍歷結果,我們稱之為層次遍歷。主要步驟:①根結點入隊;②結點出隊,並訪問;③出隊結點的左右兒子入隊。然後迴圈②③步驟便能實現二叉樹的遍歷。
二叉樹的應用
①輸出葉子結點
通過前序遍歷在訪問時稍微小改動(添加個條件)即可實現。
②求二叉樹的高度
思想:左右子樹高度+1=樹的高度
通過後序遍歷的小改動,比較左右子樹的高度,取max+1,遞迴算出樹的高度
③二元運算表示式樹及其遍歷
前中後序分別對應前中字尾表示式
其中綴表示式是不準確的(因為運算優先順序的限制),改進方法可以在輸出左子樹時新增括號,來準確表示運算順序
而我們通過兩種遍歷可以唯一確定一個二叉樹,但必須有中序遍歷才行,因為先序和後序同時對於不同二叉樹可能輸出一樣的值,即不唯一。
樹的同構問題
這是PTA上練習,還沒coding,後序會發布到我的blog,這裡總結下老師給的思路。
1.二叉樹的表示:這裡用順序(陣列)表示,除了將其視為完全二叉樹外,講了一種結構陣列(靜態連結串列)的方法來表示二叉樹。
2.建二叉樹
3.同構的判斷:注意邏輯的完整性

有兩個問題後續值得思考:
①後序遍歷非遞迴的實現演算法編寫
②樹的同構的判別具體演算法的編寫