第五章 樹和二叉樹

2021-09-29 13:03:26 字數 3112 閱讀 5515

5.1 樹的邏輯結構

樹的定義

n(n≥0)個結點的有限集合。當n=0時,稱為空樹;任意一棵非空樹滿足以下條件:

⑴有且僅有乙個特定的稱為根的結點;

⑵當n>1時,除根結點之外的其餘結點被分成m(m>0)個互不相交的有限集合t1,t2,… ,tm,其中每個集合又是一棵樹,並稱為這個根結點的子樹。

樹的基本術語:

結點的度:結點所擁有的子樹的個數。

樹的度:樹中各結點度的最大值。

葉子結點:度為0的結點,也稱為終端結點。

分支結點:度不為0的結點,也稱為非終端結點

孩子、雙親:樹中某結點子樹的根結點稱為這個結點的孩子結點,這個結點稱為它孩子結點的雙親結點;

兄弟:具有同乙個雙親的孩子結點互稱為兄弟。

路徑:如果樹的結點序列n1,n2, …, nk有如下關係:結點ni是ni+1的雙親(1<=i路徑上經過的邊的個數稱為路徑長度。

祖先、子孫:在樹中,如果有一條路徑從結點x到結點y,則x稱為y的祖先,而y稱為x的子孫

結點所在層數:根結點的層數為1;對其餘任何結點,若某結點在第k層,則其孩子結點在第k+1層。

樹的深度:樹中所有結點的最大層數,也稱高度。

層序編號:將樹中結點按照從上層到下層、同層從左到右的次序依次給他們編以從1開始的連續自然數。

有序樹、無序樹:如果一棵樹中結點的各子樹從左到右是有次序的,稱這棵樹為有序樹;反之,稱為無序樹。

森林:m (m≥0)棵互不相交的樹的集合

樹的遍歷:從根結點出發,按照某種次序訪問樹中所有結點,使得每個結點被訪問一次且僅被訪問一次。

5.2 樹的儲存結構

雙親表示法:用一維陣列來儲存樹的各個結點(一般按層序儲存),陣列中的乙個元素對應樹中的乙個結點,包括結點的資料資訊以及該結點的雙親在陣列中的下標。

孩子鍊錶表示法:把每個結點的孩子排列起來,看成是乙個線性表,且以單鏈表儲存,則n個結點共有n 個孩子鍊錶。這 n 個單鏈表共有n 個頭指標,這 n 個頭指標又組成了乙個線性表,為了便於進行查詢採用順序儲存。最後,將存放n個頭指標的陣列和存放n個結點的陣列結合起來,構成孩子鍊錶的表頭陣列。

雙親孩子表示法

孩子兄弟表示法

5.3二叉樹的邏輯結構

二叉樹是n(n≥0)個結點的有限集合,該集合或者為空集(稱為空二叉樹),或者由乙個根結點和兩棵互不相交的、分別稱為根結點的左子樹和右子樹的二叉樹組成。

特點⑴每個結點最多有兩棵子樹;

⑵二叉樹是有序的,其次序不能任意顛倒。

二叉樹的基本形態:空二叉樹

只有乙個根結點

根結點只有右子樹

根結點只有左子樹

根結點同時有左右子樹

特殊的二叉樹:斜樹

滿二叉樹

完全二叉樹

二叉樹的基本性質

性質5-1二叉樹的第i層上最多有2i-1個結點(i≥1)。

性質5-2 一棵深度為k的二叉樹中,最多有2k-1個結點,最少有k個結點。

性質5-3 在一棵二叉樹中,如果葉子結點數為n0,度為2的結點數為n2,則有:n0=n2+1。

性質5-4 具有n個結點的完全二叉樹的深度為 log2n +1。

性質5-5 對一棵具有n個結點的完全二叉樹中從1開始按層序編號,則對於任意的序號為i(1≤i≤n)的結點(簡稱為結點i),有:

(1)如果i>1,則結點i的雙親結點的序號為 i/2;如果i=1,則結點i是根結點,無雙親結點。

(2)如果2i≤n,則結點i的左孩子的序號為2i;

如果2i>n,則結點i無左孩子。

(3)如果2i+1≤n,則結點i的右孩子的序號為2i+1;如果2i+1>n,則結點i無右孩子。

二叉樹的遍歷:指從根結點出發,按照某種次序訪問二叉樹中的所有結點,使得每個結點被訪問一次且僅被訪問一次。

5.4二叉樹的儲存結構及實現

順序儲存結構

二叉樹的順序儲存結構就是用一維陣列儲存二叉樹中的結點,並且結點的儲存位置(下標)應能體現結點之間的邏輯關係——父子關係。

二叉鍊錶:令二叉樹的每個結點對應乙個鍊錶結點,鍊錶結點除了存放與二叉樹結點有關的資料資訊外,還要設定指示左右孩子的指標。

三叉鍊錶:在二叉鍊錶的基礎上增加了乙個指向雙親的指標域

中序線索鍊錶的建立——建構函式

1.建立二叉鍊錶,將每個結點的左右標誌置為0;

2.遍歷二叉鍊錶,建立線索;

2.1 如果二叉鍊錶root為空,則空操作返回;

2.2 對root的左子樹建立線索;

2.3 對根結點root建立線索;

2.3.1 若root沒有左孩子,則為root加上前驅線索;

2.3.2 若root沒有右孩子,則將root右標誌置為1;

2.3.3 若結點pre右標誌為1,則為pre加上後繼線索;

2.3.4 令pre指向剛剛訪問的結點root;

2.4 對root的右子樹建立線索。

5.5 二叉樹遍歷的非遞迴演算法

二叉樹前序遍歷的非遞迴演算法:在前序遍歷過某結點的整個左子樹後,如何找到該結點的右子樹的根指標。

解決辦法:在訪問完該結點後,將該結點的指標儲存在棧中,以便以後能通過它找到該結點的右子樹。

5.6 樹、森林與二叉樹的轉換

樹轉換為二叉樹

⑴加線——樹中所有相鄰兄弟之間加一條連線。

⑵去線——對樹中的每個結點,只保留它與第乙個孩子結點之間的連線,刪去它與其它孩子結點之間的連線。

⑶層次調整——以根結點為軸心,將樹順時針轉動一定的角度,使之層次分明。

森林轉換為二叉樹

⑴將森林中的每棵樹轉換成二叉樹;

⑵從第二棵二叉樹開始,依次把後一棵二叉樹的根結點作為前一棵二叉樹根結點的右孩子,當所有二叉樹連起來後,此時所得到的二叉樹就是由森林轉換得到的二叉樹。

二叉樹轉換為樹或森林

⑴加線——若某結點x是其雙親y的左孩子,則把結點x的右孩子、右孩子的右孩子、……,都與結點y用線連起來;

⑵去線——刪去原二叉樹中所有的雙親結點與右孩子結點的連線;

⑶層次調整——整理由⑴、⑵兩步所得到的樹或森林,使之層次分明。

5.7 哈夫曼樹及哈夫曼編碼

哈夫曼樹:給定一組具有確定權值的葉子結點,帶權路徑長度最小的二叉樹。

哈夫曼樹應用——哈夫曼編碼

字首編碼:一組編碼中任一編碼都不是其它任何乙個編碼的字首。

字首編碼保證了在解碼時不會有多種可能

第五章樹和二叉樹

樹的邏輯結構 在樹中常常將資料元素稱為結點。任意一棵非空樹滿足以下條件 1 有且僅有乙個特定的稱為根的結點 2 當n 1時,除根結點之外的其餘節點被分成m m 0 個互不相交的有限集合t1,t2.tm,其中每個集合又是一棵樹,並稱為根節點的子樹。樹的定義是遞迴的。結點的度 某結點所擁有的子樹的個數 ...

第五章樹和二叉樹

結點的度 結點所擁有的子樹的個數。樹的度 樹中各結點度的最大值。葉子結點 度為0的結點,也稱為終端結點。分支結點 度不為0的結點,也稱為非終端結點。結點所在層數 根結點的層數為1 對其餘任何結點,若某結點在第k層,則其孩子結點在第k 1層。樹的深度 樹中所有結點的最大層數,也稱高度。層序編號 將樹中...

第五章 樹和二叉樹(5 7)

目錄5.7.3哈夫曼編碼 2.哈夫曼編碼演算法實現 3.檔案的編碼和解碼 哈夫曼 huffman 樹又稱最優樹,是一類帶權路徑長度最短的樹,在實際中有廣泛的用途。哈夫曼樹的定義,涉及路徑 路徑長度 權等概念,下面先給出這些概念的定義,然後再介紹哈夫曼樹。路徑 從乙個結點到另乙個結點之間的分支序列 路...