/*
1.在一棵二叉樹中,我們定義從a節點到b節點所經過的分支序列為從a節點到b節點的路徑;
定義從a節點到b節點所經過的分支個數為從a節點到b節點的路徑長度。
定義從二叉樹的根節點到二叉樹中全部葉節點的路徑長度之和為該二叉樹的路徑長度。
2.假設二叉樹中的葉節點都帶有權值,則能夠把這個定義推廣。設二叉樹有n歌帶權值的葉節點,定義從二叉樹的
根節點到二叉樹中全部葉節點的路徑長度與相應葉節點權值的乘積之和為該二叉樹的帶權路徑長度。
wpl=(wi*li)(i從1到n)
3.我們把具有最小帶權路徑長度的二叉樹稱作哈夫曼樹或最優二叉樹
4.哈夫曼樹構造演算法:
(1):由給定的n個權值構造n棵僅僅有根節點的二叉樹,從而得到乙個二叉樹森林f=。
(2):在二叉樹森林f中選取根節點的權值最小和次小的兩棵二叉樹作為新的二叉樹的左右子樹構造新的二叉樹,
新的二叉手的根節點權值為左右子樹根節點權值之和。
(3):從二叉樹森林f中刪除作為新二叉樹左右子樹的兩棵二叉樹,將新二叉樹增加到二叉樹森林f中。
(4):反覆步驟(2)(3)。當二叉樹森林f中僅僅剩下一顆二叉樹時。這棵二叉樹就是所構造的哈夫曼樹
5.哈夫曼樹能夠用於解決最優化問題。比如電文的編碼問題
*/#include#include#include#define maxn 10//初始設定的最大結點個數
#define maxvalue 10000//初始設定的權值最大值
#define maxbit 4//初始設定的最大編碼位數
typedef structhaffnode;//哈夫曼樹的結點構體
typedef structcode;//哈夫曼編碼的結構
//建立哈夫曼樹
void haffman(int weight,int n,haffnode hafftree)else
cd->start--;
child=parent;
parent=hafftree[child].parent;
} for(j=cd->start+1;jbit[j];//儲存每乙個葉節點的編碼
} haffcode[i].start=cd->start+1;//儲存葉結點編碼的起始位
haffcode[i].weight=cd->weight;//儲存編碼相應的權值 }}
void main();
haffnode *myhafftree=(haffnode *)malloc(sizeof(haffnode)*(2*n-1));
code *myhaffcode=(code *)malloc(sizeof(code)*n);
if(n>maxn)
haffman(weight,n,myhafftree);
haffmancode(myhafftree,n,myhaffcode);
//輸出每乙個葉節點的哈夫曼編碼
哈夫曼編碼實現
define huffmancode char typedef struct node huffmantree struct node 葉節點為n的哈夫曼樹有2 n 1個節點 用 1表示當前parent未被訪問 huffmantree createhuffmantree int wet,int n ...
實現哈夫曼編碼
include include include include include using namespace std typedef struct node vector nodes 表示結點的指標組 double char number 0 每個字元平均花費的編碼長度 const int cha...
哈夫曼編碼的實現
question.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include stdio.h include stdlib.h define stringsize 30 輸入最大字串的大小 struct bitreenode 構造二叉樹結構體 struct codestack 順...