三、樹和二叉樹
1、樹2、二叉樹
3、遍歷二叉樹和線索二叉樹
4、赫夫曼樹及應用
樹和二叉樹
樹狀結構是一種常用的非線性結構,元素之間有分支和層次關係,除了樹根元素無前驅外,其它元素都有唯一前驅。
非空樹中節點特徵:
(1)只有乙個根節點,它只有直接後繼,但沒有直接前驅;
(2)元素個數n>1時,其餘節點可分為m個互不相交的有限集合。每乙個集合本身又是一棵樹,稱為根的子樹。子樹的根節點只有乙個直接前驅,可以有任意個直接後繼。
基本術語
結點:包含資料元素以及邏輯關係資訊。
結點的度:節點擁有的子樹數目(0,1,2)。
樹的度:樹中所有結點點的度的最大值。
葉子節點:度為0的結點。
分支結點:度大於0的結點。即除葉子結點外的其它結點。
孩子結點:若結點有子樹,則子樹的根結點稱為這個節點的孩子節點。
雙親結點:反過來,此結點稱為孩子結點的雙親結點。葉子結點沒有孩子。
結點的層次:依次加一。根結點的層次為1~
樹的高度:葉子結點所在的最大層次為樹的高度,也可以稱為樹的深度。空樹高度為0。
兄弟結點:同一雙親的孩子結點之間互稱兄弟。
堂兄弟節點:同一層次,雙親不同的結點。
祖先節點&子孫節點:如名字所說。
路徑:從樹的乙個結點到另乙個結點的分支構成這兩個結點之間的路徑。
有序樹:如果將節點的各棵子樹看成從左至右是有次序的,即子樹之間存在確定的次序關係,則稱該樹為有序樹。
無序樹:根結點的各棵子樹之間不存在確定的次序關係,可以互相交換位置。
森林:m棵不相交的樹的集合構成森林。m>=0。
二叉樹二叉樹是一種適合計算機處理的特殊的樹,其每個結點至多只有兩棵子樹,並且二叉樹的兩棵子樹有左右之分。
任何樹和森林都可以轉換為二叉樹!!
二叉樹的性質:
(1) 二叉樹的第i層最多有2^(i-1)個結點;
(2) 高度為k的二叉樹上至多有(2^k)-1個結點;
(3) 任意一棵二叉樹,若它含有n個葉子節點,m個度為2的結點,則有n=m+1;
引申:滿二叉樹:只含有度為0和2的結點,且度為0的結點只出現在最後一層。
完全二叉樹:對任意一棵滿二叉樹,從它最後一層的最右結點起,按從下到上、從右到左的次序,去掉若干個結點後,得到的二叉樹。
(4) 具有n個結點的完全二叉樹的高度為[log(2)n]+1;
(5) 若對含有n個結點的完全二叉樹,按照從上到下,從左至右的次序進行1至n的編號,對完全二叉樹中任意乙個編號為i的結點,簡稱為結點i,有以下關係:
a. i=1,結點i是二叉樹的根,無雙親;若i>1,結點[i/2](向下取整)為雙親結點;
b. 若2i>n,則結點i無左x孩子,否則結點2i為左孩子;
c. 若2i+1>n,則結點i無右孩子,否則結點2i+1為右孩子。
二叉樹的儲存結構:-
1、 順序儲存結構
按照結點的層次從上到下、從左至右,將完全二叉樹結點儲存在一片連續儲存區域內。儲存只保留結點的值。這樣的方式,對於完全二叉樹來說,非常方便,因為已知結點的編號就可以推算出它的雙親和孩子結點的編號,因此是一種很經濟的儲存方式。
但是,對於一般而二叉樹來說,需要補設一些虛結點。這樣可能會造成很大的空間浪費。因此,一般情況下,很少使用順序儲存方式。
2、 鏈式儲存結構。
鍊錶的結點中至少包含:左孩子指標、資料元素、右孩子指標。這是二叉鍊錶,從根結點出發可以訪問到所有結點。缺點是,從某個節點出發,尋找雙親結點時,需要從根節點開始搜尋,效率極低!
為解決這個問題,可以在結點中增加乙個指向雙親結點的指標,即三叉鍊錶結構。
實際使用中,一般還是使用二叉鍊錶。
二叉樹遍歷
若規定先左後右的順序,則只存在:dlr先序遍歷、ldr中序遍歷、lrd後序遍歷、層次遍歷。命名根據根節點被遍歷的次序。
1、 先序遍歷:根—左子樹—右子樹
2、 中序遍歷:左子樹—根—右子樹
3、 後序遍歷:左子樹—右子樹—根
遍歷演算法:遞迴演算法很簡單,非遞迴要複雜許多。·
遍歷應用:
1、 計算結點個數與樹的高度
2、 二叉樹的銷毀
3、 二叉樹的複製
4、 二叉樹的顯示:可按中序遍歷的演算法程式設計實現。
5、 由先序序列與中序序列構造二叉樹
僅僅由二叉樹的先根遍歷序列不能唯一確定一棵二叉樹,需要在先根序列中加入空子樹的資訊;
根據一棵樹的先序遍歷和中序遍歷,或者後序遍歷和中序遍歷序列,都可以唯一地確定一棵樹。
6、 表示式的字首表示、中綴表示和字尾表示
線索二叉樹
按某種方式遍歷二叉樹,遍歷所得到結果序列就變為線性結構,樹中所有結點都按照某種次序排列在乙個線性有序的序列中,每個結點就有了唯一的前驅和後繼。
而當以二叉鍊錶為儲存結構時,只能找到結點左、右孩子資訊,而不能直接得到前驅和孩子資訊。高效經濟的方法是利用空指標成員存放結點在某種遍歷次序下的前驅或者後繼指標。
哈夫曼樹與哈夫曼編碼
huffman樹也稱最優樹,是一類帶權路徑長度最短的樹,在實際中有廣泛的用途。
路徑:從樹的乙個結點到另乙個結點的分支構成這兩個結點之間的路徑,對於huffman樹,特指從根結點到某結點的路徑。
路徑長度:路徑上的分支數叫做路徑長度。
樹的路徑長度:從樹根到每乙個結點的路徑長度之和。
權:賦予某個事物乙個量,對其屬性進行數值化描述。資料結構中有結點權和邊權。
結點的帶權路徑長度:從樹根到結點之間的路徑長度與結點上權的乘積。
樹的帶權路徑長度:簡稱wpl,樹中所有葉子結點的帶權路徑長度之和。
哈夫曼樹:根據給定的n個值w1、w2、…、wn,可以構造出多棵具有n個葉子結點且其權值分別為這n個給定值的二叉樹,其中帶權路徑長度wpl最小的二叉樹叫做最優樹。
在哈夫曼樹中,權值越大的結點離根節點越近。
哈夫曼演算法:
由n個權值構造n個帶權結點—選其中權值最小的兩個結點構造一棵新樹,它們分別為左右孩子—刪除這兩個結點,把新樹放入森林中—重複前面步驟直到只有一棵樹。
huffman編碼
思考:在已知傳輸的字元集合及其出現頻度的情況下,是否可得到更有效的編碼使得傳輸的編碼長度達到最短呢?
為了縮短編碼總長度,可採用不定長編碼。
字首碼:乙個編碼系統中,任乙個編碼都不是其他任何編碼的字首,則稱此編碼系統中的編碼是字首碼。
哈夫曼編碼就是利用哈夫曼樹來設計的最優字首編碼,也就是報文編碼總長度最短的二進位制字首編碼。利用n個字元的頻率作為權值,設計一棵哈夫曼樹。然後左分支賦值0,右分支賦值1。從根到每個葉子的路徑上,各分支的賦值分別構成乙個二進位制串。該二進位制串即為對應字元的字首編碼。
具有n個字元的報文的總編碼長度就是哈夫曼樹的帶權路徑長度,所以得到的不定長編碼就是最優字首編碼。
解碼方法:根據哈夫曼樹來走就行了。去乙個碼走一步,如果走到葉子節點就解碼。
資料結構 樹和二叉樹
第一節 二叉樹的定義與基本操作 定義 我們把滿足以下兩個條件的樹型結構叫做二叉樹 binary tree 1 每個結點的度都不大於2 2 每個結點的孩子結點次序不能任意顛倒。由定義得出 二叉樹的每個結點只能含有0 1或2個孩子,且有左右之分。1 二叉樹的五種基本形態 2 二叉樹性質 性質1 二叉樹第...
資料結構 樹和二叉樹
定義 二叉樹是n n 0 個節點的有限集合,該集合或者為空集 稱為空二叉樹 或者由乙個根節點和兩棵互不相交的 分別稱為根節點的左子樹和右子樹的二叉樹組成。特點 每個節點最多有兩棵子樹 二叉樹是有序的,其次序不能任意顛倒 斜樹 1.所有節點都只有左子樹的二叉樹稱為左斜樹 2.所有節點都只有右子樹的二叉...
資料結構 樹和二叉樹
一 樹的邏輯結構 1 樹的定義採用遞迴方法 2 樹的基本術語 結點的度 結點所擁有的子樹的個數 樹的度 樹中各結點度的最大值 葉子結點 度為0的結點 終端結點 分支結點 度不為0的結點 非終端結點 結點所在層數和高度 層序編號 從上到下,從左到右 有序樹 無序樹 如果一顆樹中結點的各子樹從左到右是有...