(一)樹:兄弟關係=二叉樹:雙親和右孩子
(二)樹:雙親和長子=二叉樹:雙親和左孩子
樹的前序遍歷等價於二叉樹的前序遍歷
樹的後序遍歷等價於二叉樹的中序遍歷
(一)森林轉換為二叉樹
1、 將森林中的每棵樹轉換成二叉樹;
2、從第二棵二叉樹開始,依次把後一棵二叉樹的根結點作為前一棵二叉樹根結點的右孩子,當所有二叉樹連起來後,此時所得到的二叉樹就是由森林轉換得到的二叉樹。
3、森林的兩種遍歷方法:
⑴前序(根)遍歷:前序遍歷森林即為前序遍歷森林中的每一棵樹。
⑵後序(根)遍歷:後序遍歷森林即為後序遍歷森林中的每一棵樹。
(二)二叉樹轉換為樹或森林
1、 加線——若某結點x是其雙親y的左孩子,則把結點x的右孩子、右孩子的右孩子、……,都與結點y用線連起來;
2、 去線——刪去原二叉樹中所有的雙親結點與右孩子結點的連線;
3、層次調整——整理由⑴、⑵兩步所得到的樹或森林,使之層次分明。
(一) 相關概念
1、葉子結點的權值:對葉子結點賦予的乙個有意義的數值量。
2、二叉樹的帶權路徑長度(wpl):設二叉樹具有n個帶權值的葉子結點,從根結點到各個葉子結點的路徑長度與相應葉子結點權值的乘積之和。
3、哈夫曼樹:給定一組具有確定權值的葉子結點,帶權路徑長度最小的二叉樹。
(二)哈夫曼樹的特點:
權值越大的葉子結點越靠近根結點,而權值越小的葉子結點越遠離根結點。
只有度為0(葉子結點)和度為2(分支結點)的結點,不存在度為1的結點.
(三)哈夫曼演算法基本思想:
1、初始化:由給定的n個權值構造n棵只有乙個根結點的二叉樹,從而得到乙個二叉樹集合f=;
2、 選取與合併:在f中選取根結點的權值最小的兩棵二叉樹分別作為左、右子樹構造一棵新的二叉樹,這棵新二叉樹的根結點的權值為其左、右子樹根結點的權值之和;
3、 刪除與加入:在f中刪除作為左、右子樹的兩棵二叉樹,並將新建立的二叉樹加入到f中;
4、 重複⑵、⑶兩步,當集合f中只剩下一棵二叉樹時,這棵二叉樹便是哈夫曼樹。
(四)哈夫曼演算法的儲存結構
設定乙個陣列hufftree[2n-1]儲存哈夫曼樹中各點的資訊,陣列元素的結點結構 。
|weight|lchild|rchild|parent|
其中:weight:權值域,儲存該結點的權值;
lchild:指標域,結點的左孩子結點在陣列中的下標;
rchild:指標域,結點的右孩子結點在陣列中的下標;
parent:指標域,該結點的雙親結點在陣列中的
struct element
;
偽**
1.陣列hufftree初始化,所有元素結點的雙親、左
右孩子都置為-1;
3. 陣列hufftree的前n個元素的權值置給定值w[n];
4. 進行n-1次合併
3.1 在二叉樹集合中選取兩個權值最小的根結點,
其下標分別為i1, i2;
3.2 將二叉樹i1、i2合併為一棵新的二叉樹k(初值為n;依次遞增);
void
huffmantree
(element hufftree,
int w,
int n )
for(i=
0; i) hufftree [i]
.weight=w[i]
;for
(k=n; k<
2*n-
1; k++
)}
(五)哈夫曼樹應用——哈夫曼編碼
1、編碼:給每乙個物件標記乙個二進位制位串來表示一組物件。
例:ascii,指令系統
2、等長編碼:表示一組物件的二進位制位串的長度相等。
3、不等長編碼:表示一組物件的二進位制位串的長度不相等。
3、字首編碼:一組編碼中任一編碼都不是其它任何乙個編碼的字首 。
字首編碼保證了在解碼時不會有多種可能。
(六)哈夫曼編碼演算法的實現
1、從葉子結點到根, 逆向求每個葉子結點對應的哈夫曼編碼
根據huffman樹中葉子節點的個數,構造乙個字串陣列,每個陣列分量是乙個字串,用於存放該節點對應的huffman編碼,對每個葉子節點i(i=0; ii是要編碼的葉子節點編號,從葉子到根結點求編碼/
if(hufftree [p].lchild==c) cd[–start]=『0』 /左分支標0/
else cd[–start]=『1』; /右分支標1/
4 迴圈結束,完成乙個字元的編碼
5 重複上述工作,直到完成所有節點的編碼
資料結構 樹 與 二叉樹 森林
一 常用術語 1 樹的節點 2 節點路徑 從根節點到該節點所經歷的節點和分支的順序。3 路徑長度 節點路徑包含的分支數。4 節點的度 節點擁有的子樹的數目。5 樹的度 所有節點的度 中 的最大值。6 葉子節點 終端節點 樹中 節點的度為0的節點。7 分支節點 非終端節點 樹中 節點的度不為0的節點。...
資料結構 哈夫曼二叉樹
今天我們來實現乙個哈夫曼二叉樹又稱最優二叉樹 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。實現原理其實很簡單對於某一些場景來說,某乙個區間段情況出現的機率是大很多的,比如成績處於中游水平的人肯定是佔大多數的,因此我們在取得這些資料時,如果按等概率去讀取會影響程式效率 所以我們可以利用哈夫...
資料結構 (二叉樹 哈夫曼編碼)
實現哈夫曼樹的建立演算法,並按哈夫曼樹實現哈夫曼編碼演算法。include include include include define maxvalue 10000 define maxleaf 30 葉子結點數 define maxnode maxleaf 2 1 樹中結點總數 using na...