關於二叉樹與樹(森林)的知識點詳解

1.二叉樹的遍歷及優缺點:

前序遍歷用來實現目錄結構的顯示。
中序遍歷用來做表達式,在編譯底層實現的時候,可以實現加減乘數
後序遍歷可以用來實現計算目錄內的文件,佔用的數據大小。

二叉樹最複雜的還是刪除,這裏特別說明一下,就像書中所說的,爲了減少算法的運行時間,在一些情況下,實際上對於刪除操作一個好的辦法就是做一下標記,並不是真實刪除,這種方法叫 做懶惰刪除(英文:lazy deletion),其實在實際的數據庫操作中我們也經常用這種方法,因爲刪除確實是消耗資源比較大的操作,在數據庫操作中也會使以後的查詢變慢。

因爲樹的定義本身就是遞歸定義,因此採用遞歸的方法去實現樹的三種遍歷不僅容易理解而且代碼很簡潔。而對於樹的遍歷若採用非遞歸的方法,就要採用棧去模擬實現。在三種遍歷中,前序和中序遍歷的非遞歸算法都很容易實現,非遞歸後序遍歷實現起來相對來說要難一點。

2.二叉樹的線索化
線索二叉樹指:n個結點的二叉鏈表中含有n+1(2n-(n-1)=n+1)個空指針域。利用二叉鏈表中的空指針域,存放指向結點在某種遍歷次序下的前趨和後繼結點的指針(這種附加的指針稱爲"線索")。這種加上了線索的二叉鏈表稱爲線索鏈表,相應的二叉樹稱爲線索二叉樹(Threaded BinaryTree)。根據線索性質的不同,線索二叉樹可分爲前序線索二叉樹、中序線索二叉樹和後序線索二叉樹三種。

優缺點:線索鏈表解決了無法直接找到該結點在某種遍歷序列中的前趨和後繼結點的問題。出現了二叉鏈表找左、右孩子困難的問題。

二叉樹的遍歷本質上是將一個複雜的非線性結構轉換爲線性結構,使每個結點都有了唯一前驅和後繼(第一個結點無前驅,最後一個結點無後繼)。對於二叉樹的一 個結點,查找其左右子女是方便的,其前驅後繼只有在遍歷中得到。爲了容易找到前驅和後繼,有兩種方法。一是在結點結構中增加向前和向後的指針fwd和 bkd,這種方法增加了存儲開銷,不可取;二是利用二叉樹的空鏈指針。現將二叉樹的結點結構重新定義如下:
                           

其中:ltag=0 時lchild指向左子女;
ltag=1 時lchild指向前驅;
rtag=0 時rchild指向右子女;
rtag=1 時rchild指向後繼;

(1)中序線索二叉樹
中序線索二叉樹:若結點的ltag=1,lchild指向其前驅;否則,該結點的前驅是以該結點爲根的左子樹上按中序遍歷的最後一個結點。若rtag=1,rchild指向其後繼;否則,該結點的後繼是以該結點爲根的右子樹上按中序遍歷的第一個結點。

(2)後序線索二叉樹
在後序線索二叉樹中查找結點*p的前驅:若結點*p無左子樹,則p->lchild指向其前驅;否則,若結點*p有左子樹,當其右子樹爲空時,其左 子樹的根(即p->lrchild)爲其後序前驅。當其右子樹非空時,其右子樹的根(即p->rchild)爲其後序前驅。

(3)先序線索二叉樹
在先序線索二叉樹中查找結點的後繼較容易,而查找前驅要知道其雙親的信息,要使用棧,所以說先序線索二叉樹也是不完善的。


二叉樹以後序遍歷序列與前序遍歷序列反映同樣的信息,二叉樹三種序列遍歷,都是反映樹的結構,他們反映的性質是一樣的。


3.最小生成樹
一個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊。[1]  最小生成樹可以用kruskal(克魯斯卡爾)算法或prim(普里姆)算法求出。
最小生成樹是無向圖的連通子圖,從不同的結點開始,圖的存儲方式不同,生成樹都不相同。

4.二叉排序樹
二叉排序樹又叫二叉查找樹,英文名稱是:Binary Sort Tree.  BST的定義就不詳細說了,我用一句話概括:左 < 中 < 右。 根據這個原理,我們可以推斷:BST的中序遍歷必定是嚴格遞增的

5.樹的存儲結構
三種常用的鏈表結構
<1>雙親表示法
利用除根以外每個節點只有一個雙親的性質。用一組連續空間存儲樹的結點(便於尋找某結點的雙親和根結點,但尋找孩子結點需遍歷整個結構)
<2>孩子表示法
<3>孩子兄弟表示法
以二叉鏈表表示爲樹的存儲結構。鏈表中結點的兩個鏈域分別指向其第一個孩子和下一個兄弟。(該結構便於查詢孩子結點,操作容易,但是破壞了樹的層次)

6.樹(森林)與二叉樹的轉換
二叉鏈表即可用於表示二叉樹的存儲結構,又可以用於表示樹的存儲結構。因此以二叉鏈表爲介,對於給定的樹(森林),可以確定唯一的一顆二叉樹與之對應。

樹轉換二叉樹的規則:
<1>樹中某結點的第一個孩子成爲對應二叉樹中該結點的左孩子。
<2>樹中某結點的右兄弟結點對應二叉樹中該結點的右孩子。
<3>樹對應的二叉樹根結點的右子樹總爲空。
樹轉換爲二叉樹其右子樹一定爲空。

                         


二叉樹轉換爲樹的規則:
若某結點是父母的左孩子,則把該結點的右孩子,右孩子的右孩子。。。,都與該結點的父結點用連線連接,最後去掉所有父母到右子女的連線。
                     

非連通的圖沒有生成樹。這是有生成樹的定義決定的:
生成樹是連通圖的包含圖中的所有頂點的極小連通子圖。如果原圖不連通,則不可能存在包含原圖中所有頂點的連通子圖。
發佈了24 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章