二叉樹性質:
1. 第i層最多有2^(i - 1)個結點
2. 深度為k的二叉樹最多有2^k - 1個結點
3. 度為0(葉子結點)的結點比度為2的結點多1
4. 總結點數 - 總邊數 = 1
可用來表示二叉樹.
表示形式如下:
廣義表建立二叉樹:
結構定義:
//以括號為分割點來區分左右子樹
//(開始壓棧標誌 . )是彈出棧標誌
typedef
struct node node;
//棧typedef
struct stack stack;
例如: 上圖的完美二叉樹的廣義表為:1(2(4, 5), 3(6, ))
輸出二叉樹廣義表形式的偽**:
輸出節點儲存的值;
如果左孩子不為空:
輸出 "(";
遞迴輸出左子樹;
如果右孩子為空:
輸出 ")"。
如果右孩子不為空:
如果左孩子為空:
輸出 "("。
輸出 「,」;
遞迴輸出右子樹;
輸出 ")"。
【規定】左孩子結點路徑為0, 右孩子結點路徑為1, 每個字母編碼就是根結點到字母對應結點的路徑
結構定義:
int data//資料區
struct node *next//next指標
實現步驟:(用小頂堆做)
維護乙個小頂堆,堆存在二維陣列中([存字元][存編碼]),彈出兩次堆頂元素(陣列0位值)
將兩個彈出元素相加的和插入堆尾,為了維護小頂堆的特性,堆會在內部進行調整。
如此反覆1, 2步驟,直到陣列中只有乙個元素為止,樹就建好了
存編碼的方式:首先每個葉子節點的編碼都初始化為』\0』
從根節點到某葉子節點的路徑中,若走左子樹,編碼存』0』,若走右子樹,編碼存』1』
二叉樹演算法三之哈弗曼樹和編碼
這一節介紹哈夫曼樹和哈弗曼編碼,其中構造哈弗曼樹的步驟如下 1.根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹ti 中只有乙個帶權為wi 根結點,其左右子樹均為空。2.在f中選取兩棵根結點的權值最小的樹作為左右子樹構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為其左右子樹上根結點的權值之...
哈夫曼編碼 二叉樹應用
其中包含兩個案列,乙個是特定的編碼,還有一種是鍵盤輸入自動計算權值以及解碼。案例一分別使用了陣列和鏈式棧實現哈夫曼樹的編碼同時可以計算壓縮率,案例二使用先序遍歷進行編碼計算總碼長 具體 如下 主類 public class testmian double weight hfmtool hfm1 ne...
最優二叉樹 哈夫曼編碼
樹的路徑長度是從樹根到樹中每一結點的路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短。結點的權值 在一些應用中,賦予樹中結點的乙個有某種意義的實數 結點的帶權路徑長度 結點到樹根之間的路徑長度與該結點上權的乘積 樹的帶權路徑長度 wpl 定義為樹中所有結點的帶權路徑長度之和 在權為w...