typedef struct node
node,*pnode;
其中data儲存資料,count儲存資料的權值。pnext指向下乙個結點。lchild指向左子樹,rchild指向右子樹。
具體實現,首先輸入資料判斷輸入的元素在表中是否存在,如果存在則相應的權值+1,若不存在,新增新的
結點在鍊錶末尾。然後
對鍊錶排序使其公升序排列。
排序完成後找到最小的兩個結點,再建立新的結點使它的左右指標分別指向上述結點。再將新結點鏈入
表中。使之成為新的頭結點。然後重複上訴工作。顯然有建立的新結點->pnext==null時迴圈結束。
所得的即為哈夫曼樹。
最後再對生成的哈夫曼樹進行編碼。規定從父節點到左子樹的距離定義為'0',到右子樹的距離定義為'1'
具體實現**如下:
#define _crt_secure_no_warnings
#include#include#include#define maxsize 100
#define char '0'
char huffcode[maxsize]; // 儲存哈夫曼編碼
int index = 0; // 從父節點到左子樹的距離定義為'0',到右子樹的距離定義為'1'
typedef struct node
node,*pnode;
// 建立結點用鍊錶串起來
pnode addnode(char ch)
// 建立哈夫曼樹的結點
pnode addhoffmantree()
// 向鍊錶中新增字元,若出現權值+1,若沒出現再建立乙個結點,連到鍊錶後面
else
p = p->pnext;
} if (flag)
}}// 列印出煉表中的所有結點,及其權值
void printallnode(pnode phead)
}// 對鍊錶進行排序
void sortlist(pnode phead)
} }}// 將兩個結點變成新樹的左右子樹
void combinenode(pnode p, pnode p1, pnode p2)
// 建立哈夫曼樹
pnode createhoffmantree(pnode phead)
return pfirst;
}//列印哈夫曼編碼 左'0' 右'1'
void bulidhoffmancode(pnode phead)
if (phead->rchild)
// 列印編碼,將生產的新結點排除掉
if (!phead->lchild && !phead->rchild && phead->data!=char)
{ printf("%c的編碼為:", phead->data);
for (int i = 0; i
執行結果:
寫的很爛,只能湊合著看了。
哈夫曼編碼 二叉樹應用
其中包含兩個案列,乙個是特定的編碼,還有一種是鍵盤輸入自動計算權值以及解碼。案例一分別使用了陣列和鏈式棧實現哈夫曼樹的編碼同時可以計算壓縮率,案例二使用先序遍歷進行編碼計算總碼長 具體 如下 主類 public class testmian double weight hfmtool hfm1 ne...
最優二叉樹 哈夫曼編碼
樹的路徑長度是從樹根到樹中每一結點的路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短。結點的權值 在一些應用中,賦予樹中結點的乙個有某種意義的實數 結點的帶權路徑長度 結點到樹根之間的路徑長度與該結點上權的乘積 樹的帶權路徑長度 wpl 定義為樹中所有結點的帶權路徑長度之和 在權為w...
哈夫曼樹(最優二叉樹)
給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...