1) 了解樹的定義、表示形式和基本術語
2) 了解二叉樹的概念和性質
3) 掌握二叉樹的幾種遍歷方法
4) 理解二叉樹的遍歷方法的C語言代碼實現
5) 了解樹的存儲結構
6)了解哈夫曼樹和哈夫曼編碼的基本概念
樹的定義
樹(Tree),是n(n≥0)個結點的有限集。若n=0時稱為空樹;若n>0時為非空樹。
在一個非空樹中,有且僅有一個稱為根的結點。除根以外的其他結點划分為m(m>0)個互不相交的有限集T1,T2,. . .,Tm,其中每一個集合本身又是一棵樹,並且稱為根的子樹(SubTree)。
例如下圖是只有一個結點的樹,這個唯一的結點也是這棵樹的根節點:
再比如下面這棵樹:
這棵樹有9個結點,其中A是根,其余結點組成2個互不相交的子集:T1={B, D, E, I},T2={C, F, G, H},T1和T2都是A的子樹,其本身也是一棵樹:
在樹T1中,B是根節點,其余結點又分為兩個互不相交的子樹:T11={D, I},T12={E}。在樹T11中D是根,其包含由結點I組成的子樹。從這個概念上我們可以看出樹的定義是一個遞歸的定義,即在樹的定義中又用到了樹的定義,而遞歸也將是實現樹的相關操作的一個重要手段。
樹的表示方法
樹形表示法
目錄結構表示
韋恩圖表示法
廣義表表示法
凹入表示法
樹的基本概念(※有關術語※重點※)
以下圖為例子:
-
結點:數據元素以及指向子樹的分支。圖中的A,B,C等都是結點。
-
根結點:非空樹中無前驅結點的結點。圖中的A結點。
-
結點的度(Degree):結點擁有的子樹數量。圖中度為3的有:A、D,度為2的有:B、E、H,度為1的有:C、H。
-
樹的度:樹內各結點的度的最大值。上圖中樹的度為3。
-
葉子結點(終端結點)(Leaf):樹沒有子結點,即度為0的結點。圖中的F,G,I,J,K,L,M 都是葉子結點。
-
分支結點(分支點或非終端結點):不屬於葉子結點的結點,即度不為0的結點。A,B,C,D等都是分支結點。
-
內部結點(中間結點):根結點以外的分支結點。B,C,D,E,H等都是內部結點。
-
層次(Level):從根結點開始,根結點為第一層(A),根的子結點為第二層(B,C,D),以此類推。從根結點到樹中某結點所經路徑上的分支數稱為該結點的層次。根結點的層次在不同教材中有規定為1,也有規定為0,其余結點的層次等於其雙親結點的層次加1。所以某結點在第n層,則其孩子就在第n+1層。(筆者這里默認根結點為1)
-
結點深度:對任意結點x,x結點的深度表示為根結點到x結點的路徑長度。所以根結點深度為0,第二層結點深度為1,以此類推;如深度為3的結點有:K,L,M,深度為2的結點有:E、F、G、H、I、J
-
結點高度:對任意節點x,葉子節點到x節點的路徑長度就是節點x的高度
-
樹的深度:樹從根結點開始往下數,葉子結點所在的最大層數稱為 樹的深度。一棵樹中結點的最大層次就是樹的深度,深度定義是從上往下的。如圖中樹的深度為:4(默認根結點為1)
-
樹的高度:數值上和深度一樣,高度定義是從下往上的。如圖中樹的高度為:4
-
孩子-雙親(child-parent):結點的子樹的根稱為該結點的孩子,該結點稱為孩子的雙親。圖中,E是L的雙親,L是E的孩子。
-
兄弟結點(Sibling):有一些結點,它們有共同的雙親,則稱這些結點為兄弟結點。圖中的H,I,J就是兄弟結點。
-
堂兄弟結點:雙親在同一層上的結點稱為堂兄弟結點。圖中的G,H就是堂兄弟結點。
-
結點的祖先:從根到該結點所經分支上的所有的結點。A,D,H結點都是結點M的祖先。
-
結點的子孫:以某結點為根的子樹中的任一結點。
-
樹的深度:樹中結點的最大層次。圖中的樹的深度為4。
-
有序樹:樹中結點的各子樹從左至右右次序。
-
無序樹:樹中結點的各子樹無次序。
-
森林:是m(m≥0)棵互不相交的樹的集合。把根結點刪除樹就變成了森林;一棵樹可以看成是一個特殊的森林;給森林中的各子樹加上一個雙親結點,森林就變成了樹。
樹一定是森林,而森林不一定是樹。
二叉樹(Binary Tree)
二叉樹的定義
二叉樹(Binary Tree)是n(n≥0)個結點所構成的有限集合,它或者是空樹(n=0),或者由一個根結點和兩棵互不相交的、分別稱為根結點的左子樹和右子樹的二叉樹組成。
P.S. 殷人昆教授對於二叉樹的基本定義——
二叉樹是結點的一個有限集合,該集合或者為空,或者是由一個根結點加上兩棵分別稱為左子樹和右子樹的、互不相交的二叉樹組成。
二叉樹的特點
1)二叉樹每個結點最多有兩棵子樹,所以二叉樹中不存在度大於2的結點
2)左子樹和右子樹是有順序的,次序不能任意顛倒
3)即使樹中某個結點只有一棵子樹,也要嚴格區分左右。
為什么要重點研究最多只有兩個“叉”的樹呢?因為二叉樹的結構最簡單,規律性最強,另外還可以證明所有的樹都可以轉為唯一對應的二叉樹。
二叉樹的基本形態
二叉樹有五種基本形態:
1)空二叉樹
2)只有一個根結點
3)根結點只有左子樹
4)根結點只有右子樹
5)根結點既有左子樹又有右子樹
如下圖所示:
從基本形態延申形態
從這五種基本形態考慮,如果一棵樹只有三個結點,那么這棵二叉樹可以有如下幾種形態,而且它們代表了不同的二叉樹:
特殊二叉樹
斜樹
該二叉樹中的所有結點只有左子樹或者只有右子樹,相對應的就被稱為左斜樹和右斜樹。如下圖所示:
滿二叉樹(Full Binary Tree)
在一棵二叉樹中,如果所有的分支結點都存在左子樹和右子樹,並且葉結點都在同一層上,這樣的二叉樹就稱為滿二叉樹。例如下圖所示:
滿二叉樹的定義:
一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為K,且結點總數是(2^k) -1 ,則它就是滿二叉樹。
深度k的滿二叉樹是有2^k-1個結點的二叉樹,在滿二叉樹中,每一層結點都達到了最大個數,除最底層結點的度為0外,其他各層結點的度都為2。
滿二叉樹的特點
a.葉子只能出現在最下一層
b.非葉子結點的度一定是2
c.同樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子數最多。
完全二叉樹(Complete Binary Tree)
如果對一棵具有n個結點的二叉樹按層序編號,如果該樹中結點的編號與同樣深度的滿二叉樹中相同位置的結點的編號完全相同時,稱之為完全二叉樹。如下圖所示:
滿二叉樹一定是完全二叉樹,但完全二叉樹不一定是滿的。
如果因為某些結點缺少子樹導致空擋,而使得編號不對應時,就不能算是完全二叉樹,如下圖的樹就不是一棵完全二叉樹:
完全二叉樹的定義
如果一棵具有n個結點的深度為k的二叉樹,它的每一個結點都與高度為k的滿二叉樹中編號為1 ~ n-1的結點一一對應,則稱這棵二叉樹為完全二叉樹。 其特點是:上面從第1層到第k-1層的所有各層的結點數都是滿的,僅最下面的第k層是滿的,或從右往左連續缺少若干結點。
完全二叉樹的特點
a.葉子結點只能出現在最下兩層。
b.最下層的葉子一定集中在左部連續位置。
c.倒數第二層如果有葉結點,一定都在右部連續。
d.如果結點度為1,則該結點只有左孩子,不存在只有右子樹的情況。
e.相同結點樹的二叉樹中,完全二叉樹的深度最小。
二叉樹的性質(※重點※)
參考https://www.cnblogs.com/duan-decode/p/9610986.html
接下來的描述中有必要用到一些數學符號,在Markdown中不好畫出,因此我們再次規定一些符號——
-
a^b—— a的b的次方 (計算機常用,無需多言)
-
int_UP()—— 向上取整(即去掉浮點數的小數部分,然后將整數部分加1)
-
int_DOWN()—— 向下取整(即去掉浮點數的小數部分,只留整數部分)
-
log(a,b) —— 表示以a為底取b的對數
以下圖為例
圖1
圖2
性質1:
在二叉樹的第i(i>=1)層 1最多有2^(i - 1)個結點。 (默認根結點為第一層)
證明:通過數學歸納法----因為說的是第i層的最多的結點數,所以可以觀察滿二叉樹,第1層有1個跟結點A,第2層有2個跟的子結點(B,C),第3層有4個結點(D,E,F,G),第四層有8個結點,可以發現第2層開始每一層都是上一層的2倍,很容易歸納出第i層最多有2^(i - 1)個結點。
性質2:
深度 2為k(k>=0)的二叉樹最少有k個結點,最多有2^k-1個結點 (默認根結點為1)
由性質1可知,k層的最大節點總數可表示為2^0+2^ 1+……+2^ (k-1) = 2^k- 1;
注意這里不是2的(k-1)次方,而是2的k次方再減1。同樣以滿二叉樹來觀察,深度即層數,1層的滿二叉樹只有1個結點,2層時有(1+2)個結點,3層時有(1+2+4)個結點,這里使用簡單的數學知識可做以下推導,記深度為k的二叉樹最多結點數為Sk,則有:
Sk=2^0+2^1+2^2+…+2^(k-1) 對該式兩邊乘以2可得:
2Sk=2^1+2^2+2^3+…+2^k 再使用下式減去上式可得:
Sk=2^k-2^0,所以可得深度為k的二叉樹最多有2^k - 1個結點(滿二叉樹),最少為k個結點(只有左子樹或右子樹)。
性質3:
對於任一棵非空二叉樹,若其葉子結點(度 3為0的結點)數為n0,度為2的非葉子結點(分支結點)數為n2,則n0=n2+1;
證明:設,度為2的結點數為n2,且有兩條通向子結點的邊,度為1的結點數為n1,且有一條邊,度為0的結點數為n0,無邊。
計算結點總數:
二叉樹的度只可能為0(只有一個·根結點或葉子結點)或1或2;
所以樹中結點總數為 N = n0 + n1 + n2;①
計算樹的邊數:
邊的總數為 E = n2 * 2 + n1 * 1 + n0 * 0;②
根據定義:樹中,邊的條數 = 結點總數 - 1,因此得到:
E = N - 1;③
聯立 ① ②③ 消去E、N,可得:n2 * 2 + n1 = n0 + n1 + n2 -1 ;
即 n0 = n2 + 1;
性質4:
具有n個結點的完全二叉樹的深度為int_UP(log(2,n+1))。(int_UP :向上取整)
3.321928向上取整為 4,因此 樹的深度為4;
性質5:
如果將一棵有n個結點的完全二叉樹自頂向下,同一層自左向右連續給結點編號1,2,3,......,n,然后按此結點編號將樹中各結點順序的存放於一個一維數組,並簡稱編號為i的結點為結點i( i>=1 && i<=n),則有以下關系:
-
若 i= 1,則結點i為根,無父結點;若 i> 1,則結點 i 的父結點為結點int_DOWN(i / 2);
-
若 2*i <= n,則結點 i 的左子女為結點 2*i; (根結點為1時,左結點為偶數)
-
若2*i<=n,則結點i的右子女為結點2*i+1; (根結點為1時,右結點為奇數)
-
若結點編號i為奇數,且i!=1,它處於右兄弟位置,則它的左兄弟為結點i-1;
-
若結點編號i為偶數,且i!=n,它處於左兄弟位置,則它的右兄弟為結點i+1;
-
結點i所在的層次為 int_UP(log(2,i+1))。 (如圖2中 8 在第四層,對log(2,9)向上取整為4 )