數(shù)據(jù)結(jié)構(gòu)之哈夫曼樹和編碼器的構(gòu)造

在最近的自學(xué)數(shù)據(jù)結(jié)構(gòu)的過程中,為加深樹的理解,碼了一個(gè)二叉樹編碼器,請多多指教:



#include

#define MAXBIT100

//最大子樹

#define MAXVALUE10000

//最大值

#define MAXLEAF30

//最大編碼數(shù)

#define MAXNODEMAXLEAF*2 -1

//最大節(jié)點(diǎn)數(shù)

typedef struct

{

int bit[MAXBIT];

int start;

} HCodeType;/*編碼結(jié)構(gòu)體*/

typedef struct

{

int weight;

int parent;

int lchild;

int rchild;

} HNodeType;/*結(jié)點(diǎn)結(jié)構(gòu)體*/

/*構(gòu)造哈夫曼樹*/

void HuffmanTree(HNodeType HuffNode[MAXNODE],int n)

{

/* i屁置、j:循環(huán)變量,m1仁连、m2:構(gòu)造哈夫曼樹不同過程中兩個(gè)最小權(quán)值結(jié)點(diǎn)的權(quán)值蓝角,

x1、x2:構(gòu)造哈夫曼樹不同過程中兩個(gè)最小權(quán)值結(jié)點(diǎn)在數(shù)組中的序號饭冬。*/

int i,j,m1,m2,x1,x2;

/*初始化存放哈夫曼樹數(shù)組HuffNode[]中的結(jié)點(diǎn)*/

for(i=0;i<2*n-1;i++)

{

HuffNode[i].weight = 0;

HuffNode[i].parent =-1;

HuffNode[i].lchild =-1;

HuffNode[i].lchild =-1;

} /* end for */

/*輸入n個(gè)葉子結(jié)點(diǎn)的權(quán)值*/

for(i=0;i

{

printf("Please input weight of leaf node %d: \n",i);

scanf("%d",&HuffNode[i].weight);

} /* end for */

/*循環(huán)構(gòu)造Huffman樹*/

for(i=0;i

{

m1=m2=MAXVALUE;/* m1使鹅、m2中存放兩個(gè)無父結(jié)點(diǎn)且結(jié)點(diǎn)權(quán)值最小的兩個(gè)結(jié)點(diǎn)*/

x1=x2=0;

/*找出所有結(jié)點(diǎn)中權(quán)值最小、無父結(jié)點(diǎn)的兩個(gè)結(jié)點(diǎn)昌抠,并合并之為一顆二叉樹*/

for(j=0;j

{

if(HuffNode[j].weight < m1 && HuffNode[j].parent==-1)

{

m2=m1;

x2=x1;

m1=HuffNode[j].weight;

x1=j;

}

else if(HuffNode[j].weight < m2 && HuffNode[j].parent==-1)

{

m2=HuffNode[j].weight;

x2=j;

}

} /* end for */

/*設(shè)置找到的兩個(gè)子結(jié)點(diǎn)x1患朱、x2的父結(jié)點(diǎn)信息*/

HuffNode[x1].parent= n+i;

HuffNode[x2].parent= n+i;

HuffNode[n+i].weight = HuffNode[x1].weight + HuffNode[x2].weight;

HuffNode[n+i].lchild = x1;

HuffNode[n+i].rchild = x2;

printf("x1.weight and x2.weight in round %d: %d,%d\n",i+1,HuffNode[x1].weight,HuffNode[x2].weight);/*用于測試*/

printf("\n");

} /* end for */

} /* end HuffmanTree */

int main(void)

{

HNodeType HuffNode[MAXNODE];/*定義一個(gè)結(jié)點(diǎn)結(jié)構(gòu)體數(shù)組*/

HCodeType HuffCode[MAXLEAF],cd;/*定義一個(gè)編碼結(jié)構(gòu)體數(shù)組,同時(shí)定義一個(gè)臨時(shí)變量來存放求解編碼時(shí)的信息*/

int i,j,c,p,n;

printf("Please input n:\n");

scanf("%d",&n);

HuffmanTree(HuffNode,n);

for(i=0;i < n;i++)

{

cd.start = n-1;

c = i;

p = HuffNode[c].parent;

while(p != -1)/*父結(jié)點(diǎn)存在*/

{

if(HuffNode[p].lchild == c)

cd.bit[cd.start]= 0;

else

cd.bit[cd.start]= 1;

cd.start--;/*求編碼的低一位*/

c=p;

p=HuffNode[c].parent;/*設(shè)置下一循環(huán)條件*/

} /* end while */

/*保存求出的每個(gè)葉結(jié)點(diǎn)的哈夫曼編碼和編碼的起始位*/

for(j=cd.start+1;j

{ HuffCode[i].bit[j]= cd.bit[j];}

HuffCode[i].start = cd.start;

} /* end for */

/*輸出已保存好的所有存在編碼的哈夫曼編碼*/

for(i=0;i

{

printf("%d 's Huffman code is: ",i);

for(j=HuffCode[i].start+1;j < n;j++)

{

printf("%d",HuffCode[i].bit[j]);

}

printf("\n");

}

getchar();

return 0;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炊苫,一起剝皮案震驚了整個(gè)濱河市裁厅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侨艾,老刑警劉巖执虹,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異唠梨,居然都是意外死亡声畏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門姻成,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人愿棋,你說我怎么就攤上這事科展。” “怎么了糠雨?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵才睹,是天一觀的道長。 經(jīng)常有香客問我,道長琅攘,這世上最難降的妖魔是什么垮庐? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮坞琴,結(jié)果婚禮上哨查,老公的妹妹穿的比我還像新娘。我一直安慰自己剧辐,他們只是感情好寒亥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荧关,像睡著了一般溉奕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忍啤,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天加勤,我揣著相機(jī)與錄音,去河邊找鬼同波。 笑死鳄梅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的参萄。 我是一名探鬼主播卫枝,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼讹挎!你這毒婦竟也來了校赤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤筒溃,失蹤者是張志新(化名)和其女友劉穎马篮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜奖,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浑测,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歪玲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迁央。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖滥崩,靈堂內(nèi)的尸體忽然破棺而出岖圈,到底是詐尸還是另有隱情,我是刑警寧澤钙皮,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布蜂科,位于F島的核電站顽决,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏导匣。R本人自食惡果不足惜才菠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贡定。 院中可真熱鬧赋访,春花似錦、人聲如沸厕氨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽命斧。三九已至田晚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間国葬,已是汗流浹背贤徒。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汇四,地道東北人接奈。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像通孽,于是被迫代替她去往敵國和親序宦。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容