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 樹又稱最優樹,是一類帶權路徑長度最短的樹,在實際中有廣泛的用途。哈夫曼樹的定義,涉及路徑 路徑長度 權等概念,下面先給出這些概念的定義,然後再介紹哈夫曼樹。路徑 從乙個結點到另乙個結點之間的分支序列 路...