#include#include#includetypedef struct
huffmantree;
typedef char *huffmancode; //赫夫曼編碼
void selectnode(huffmantree *ht,int n,int *bt1,int *bt2) //從1~i-1個結點選擇parent結點為0
if(ht2==null) //結點指標2為空
continue;
}if(ht1&&ht2) //若ht1,ht2兩個指標都有效
else if(ht[i].weightweight) //若第i個結點權重小於ht2指向的結點}}
}if(ht1>ht2) //增加比較,使二叉樹左側為葉結點
else
}void createtree(huffmantree *ht,int n,int *w)
for(;i<=m;++i)
for(i=n+1;i<=m;++i) //逐個結算非葉結點,建立赫夫曼樹
}void huffmancoding(huffmantree *ht,int n,huffmancode *hc)
hc[i-1]=(char*)malloc(sizeof(char)*(n-start)); //分配儲存編碼的記憶體
strcpy(hc[i-1],&cd[start]); //賦值生成的編碼
} free(cd); //釋放編碼占用的記憶體
}void encode(huffmancode *hc,char *alphabet,char *str,char *code) //將乙個字串轉換乘為赫夫曼編碼
//hc為赫夫曼編碼表,alphabet為對應的字母表,str為需要轉換的字串,code返回轉換的結果
code[len]='\0';
}void decode(huffmantree *ht,int m,char *code,char *alphabet,char *decode)
//將乙個赫夫曼編碼組成字串轉換為文字串
//ht為赫夫曼二叉樹,m為字元數量,alphabet為對應的字母表,str為需要轉換的字串,decode返回轉換的結果
decode[j]=alphabet[i-1]; //得到乙個字母
j++;
} decode[j]='\0';
}int main()
; //4個字元
int w=; //4個字元的權重
huffmantree *ht;
huffmancode *hc;
m=2*n-1;
ht=(huffmantree *)malloc((m+1)*sizeof(huffmantree)); //申請記憶體,儲存赫夫曼樹
if(!ht)
hc=(huffmancode *)malloc(n*sizeof(char*));
if(!hc)
createtree(ht,n,w); //建立赫夫曼樹
huffmancoding(ht,n,hc);
for(i=1;i<=n;i++)
printf("字母:%c,權重:%d,編碼為:%s\n",alphabet[i-1],ht[i].weight,hc[i-1]);
encode(hc,alphabet,test,code); //根據赫夫曼編碼生成編碼字串
printf("\n字串:\n%s\n轉換後:\n%s\n",test,code);
decode(ht,n,code,alphabet,code1); //根據編碼字串生成解碼後的字串
printf("\n編碼:\n%s\n轉換後為:\n%s\n",code,code1);
getchar();
return 0;
}
最優二叉樹
所謂哈夫曼樹即最優二叉樹,其特點是帶權路徑長度最小 建樹原理 將最小數結點放到最下面,大數放到離頂點近的地方,建樹時從下往上建,每上一層下一層的數就被重複加一次,這樣最終得到完整樹 資料結構實驗之二叉樹六 哈夫曼編碼 problem description 字元的編碼方式有多種,除了大家熟悉的asc...
滿二叉樹 完全二叉樹 平衡二叉樹 最優二叉樹
一棵二叉樹的結點要麼是葉子結點,要麼它有兩個子結點 如果乙個二叉樹的層數為k,且結點總數是 2k 12 k 1 2k 1 則它就是滿二叉樹。若設二叉樹的深度為k,除第 k 層外,其它各層 1 k 1 的結點數都達到最大個數,第k 層所有的結點都連續集中在最左邊,這就是完全二叉樹。它或者是一顆空樹,或...
滿二叉樹 完全二叉樹 平衡二叉樹 最優二叉樹
一 滿二叉樹 一棵二叉樹的結點要麼是葉子結點,要麼它有兩個子結點 如果乙個二叉樹的層數為k,且結點總數是 2 k 1,則它就是滿二叉樹。二 完全二叉樹 若設二叉樹的深度為k,除第 k 層外,其它各層 1 k 1 的結點數都達到最大個數,第k 層所有的結點都連續集中在最左邊,這就是完全二叉樹。三 平衡...