C#數據結構與算法揭秘七


前面介紹了線性結構,線性結構中的數據元素是一對一的關系。本章和下一章介紹兩種非常重要的非線性結構:樹形結構和圖狀結構。樹形結構是一對多的非線性結構,非常類似於自然界中的樹,數據元素之間既有分支關系,又有層次關系。樹形結構在現實世界中廣泛存在,如家族的家譜(圖一)、一個單位的行政機構組織(圖二)等都可以用樹形結構來形象地表示。

樹形結構在計算機領域中也有着非常廣泛的應用,如 Windows 操作系統中對磁盤文件的管理、編譯程序中對源程序的語法結構的表示等都采用樹形結構。在數據庫系統中,樹形結構也是數據的重要組織形式之一。樹形結構多叉樹和二叉樹兩種,多叉樹的操作實現比較復雜,但多叉樹可以轉換為二叉樹進行處理,所以,本章主要討論二叉樹。

windows資源管理器是一個最典型的樹形結構。

一張自然中典型的二叉樹。

第一個問題,什么是樹。所謂的樹(Tree)是 n(n≥0)個相同類型的數據元素的有限集合。樹中的數據元素叫結點(Node)。n=0 的樹稱為空樹(Empty Tree);對於 n>0 的任意非空樹 T 有: 

(1)有且僅有一個特殊的結點稱為樹的根(Root)結點,根沒有前驅結點; 如圖所示。

(2)若n>1,則除根結點外,其余結點被分成了m(m>0)個互不相交的集合T1,T2,…,Tm,其中每一個集合Ti(1≤i≤m)本身又是一棵樹。樹T1,T2,…,Tm
稱為這棵樹的子樹(Subtree)。如圖所示:


由樹的定義可知,樹的定義是遞歸的,用樹來定義樹。因此,二叉樹的許多算法都使用了遞歸。 樹的形式定義為:樹(Tree)簡記為 T,是一個二元組, T = (D, R) 其中:D 是結點的有限集合;  是結點之間關系的有限集合。

由上述兩個特點可知,圖 5.2所示的都不是樹

樹的術語很多,我們來一一進行介紹。

1、結點(Node):表示樹中的數據元素,由數據項和數據元素之間的關系組成。在下圖中,共有 7個結點。
2、結點的度(Degree of Node):結點所擁有的子樹的個數,在下圖中,孫子結點的度為 3。
3、樹的度(Degree of Tree):樹中各結點度的最大值。在下圖中,樹的度為3.
4、葉子結點(Leaf Node):度為 0 的結點,也叫終端結點。在下圖中,子結點和孫子結點都是葉子結點。
5、 分支結點(Branch Node): 度不為 0 的結點, 也叫非終端結點或內部結點。在下圖中,根結點和子結點是分支結點。

6、孩子(Child):結點子樹的根。在下圖中,子結點是根結點的孩子。 

7、雙親(Parent):結點的上層結點叫該結點的雙親。在下圖中,子結點的雙親是根結點。
8、祖先(Ancestor):從根到該結點所經分支上的所有結點。在下圖中,孫子結點的祖先是子節點和根節點。
9、子孫(Descendant):以某結點為根的子樹中的任一結點。在下圖中,除根結點之外的所有結點都是根結點的子孫。
10、兄弟(Brother):同一雙親的孩子。在下圖中,子結點互為兄弟。
11、結點的層次(Level of Node):從根結點到樹中某結點所經路徑上的分支數稱為該結點的層次。根結點的層次規定為 1,其余結點的層次等於其雙親結點的層次加 1。

12、堂兄弟(Sibling):同一層的雙親不同的結點。
13、樹的深度(Depth of Tree):樹中結點的最大層次數。在下圖中,樹的深度為 3。
14、無序樹(Unordered Tree):樹中任意一個結點的各孩子結點之間的次序構成無關緊要的樹。通常樹指無序樹。
15、有序樹(Ordered Tree):樹中任意一個結點的各孩子結點有嚴格排列次序的樹。二叉樹是有序樹,因為二叉樹中每個孩子結點都確切定義為是該結點的左孩子結點還是右孩子結點。
16、森林(Forest):m(m≥0)棵樹的集合。自然界中的樹和森林的概念差別很大,但在數據結構中樹和森林的概念差別很小。從定義可知,一棵樹有根結點和m 個子樹構成,若把樹的根結點刪除,則樹變成了包含 m 棵樹的森林。當然,根據定義,一棵樹也可以稱為森林

樹的邏輯表示方法很多,這里只講幾種常見的表示方法。
1、直觀表示法
它象日常生活中的樹木一樣。整個圖就象一棵倒立的樹,從根結點出發不斷擴展,根結點在最上層,葉子結點在最下面,如上圖所示。
2、凹入表示法
每個結點對應一個矩形,所有結點的矩形都右對齊,根結點用最長的矩形表示,同一層的結點的矩形長度相同,層次越高,矩形長度越短,上圖中的樹的凹入表示法如下圖所示。

3、廣義表表示法
用廣義表的形式表示根結點排在最前面, 用一對圓括號把它的子樹結點括起來,子樹結點用逗號隔開。樹的廣義表表示如下: 

(根結點(子結點(孫子結點,孫子結點),子結點(孫子結點,孫子結點)))

4、嵌套表示法
類似數學中所說的文氏圖表示法,如下圖所示。

二叉樹的形態共有 5 種:空二叉樹、只有根結點的二叉樹、右子樹為空的二叉樹、左子樹為空的二叉樹和左、右子樹非空的二叉樹。二叉樹的 5 種形態如圖所示。

(1) 滿二叉樹(Full Binary Tree): 如果一棵二叉樹只有度為 0 的結點和度為 2的結點, 並且度為 0 的結點在同一層上, 則這棵二叉樹為滿二叉樹, 如圖(a)所示。
由定義可知,對於深度為k的滿二叉樹的結點個數為 2k-1。

(2)完全二叉樹(Complete Binary Tree):深度為 k,有 n 個結點的二叉樹當且僅當其每一個結點都與深度為 k,有 n 個結點的滿二叉樹中編號從 1 到 n的結點一一對應時,稱為完全二叉樹,如下圖(b)所示。 完全二叉樹的特點是葉子結點只可能出現在層次最大的兩層上, 並且某個結點的左分支下子孫的最大層次與右分支下子孫的最大層次相等或大 1。

性質 1 一棵非空二叉樹的第i層上最多有 2
i-1個結點(i≥1)。
證明:采用數學歸納法進行證明。當n=1時,二叉樹只有 1層,這一層只有根結點一個結點,所以第 1 層的結點數為 21-1=1,結論成立。假設當n=N時結論成立,即第N層最多有 2N-1個結點;當n=N+1 時,根據二叉樹的定義,第N層的每個結點最多有 2個子結點,所以第N+1層上最多有 2N-1*2=2N=2(N+1)-1個結點,
結論成立。綜上所述,性質 1成立。


性質 2 若規定空樹的深度為 0,則深度為k的二叉樹最多有 2
k-1 個結點(k≥0)。
證明:當k=0時,空樹的結點數為 20-1=0,結論成立。當深度為k(k>0)時,
由性質 1可知,第i(1≤i≤k)層最多有 2i-1個結點,所以二叉樹的最多結點數是:1+2^1+.......+2^(i-1)=2^i-1


性質 3 具有n個結點的完全二叉樹的深度k-為log2n+1。
證明:根據性質 2和完全二叉樹的定義可知,當一棵完全二叉樹的結點數為n、深度為 k 時,有 2k-1-1<n≤2k-1
即 2k-1≤n<2k對不等式取對數,有 k-1≤log2n<k 由於k是整數,所以有k=log2n+1。 

性質 4 對於一棵非空二叉樹,如果度為 0 的結點數目為n0,度為 2 的結點數目為n2,則有n0= n2+1。
證明:設n為二叉樹的結點總數,n1二叉樹中度為 1的結點數目,則有 n= n0+ n1+ n2在二叉樹中,除根結點外,其余結點都有唯一的一個進入分支。設 B 為二叉樹中的分支總數,則有 B=n-1 這些分支由度為1和度為2的結點發出的, 一個度為1的結點發出一個分支,一個度為 2的結點發出 2個分支,所以有 B= n1+2 n2  綜合上面 3個式子,可以得到 n0= n2+1 

性質 5 對於具有 n 個結點的完全二叉樹,如果按照從上到下和從左到右的順序對所有結點從 1 開始編號,則對於序號為 i 的結點,有:
(1) 如果 i>1, 則序號為 i 的結點的雙親結點的序號為 i/2( “/” 表示整除);如果 i=1,則該結點是根結點,無雙親結點。
(2)如果 2i≤n,則該結點的左孩子結點的序號為 2i;若 2i>n,則該結點無左孩子。
(3)如果 2i+1≤n,則該結點的右孩子結點的序號為 2i+1;若 2i+1>n,則該結點無右孩子

這就是對二叉樹的性質的基本介紹,下屆從源代碼的層次來進行實現。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM