最優二叉樹

2021-08-20 11:52:08 字數 1899 閱讀 4372

#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 層所有的結點都連續集中在最左邊,這就是完全二叉樹。三 平衡...