【資料結構筆記】哈夫曼樹的構造演算法
阿新 • • 發佈:2018-12-22
原教材《資料結構教程》(第5版)李春葆 主編(武漢大學資料結構課程教材)
《演算法筆記》那本書上並沒有直接給出哈夫曼樹的構造程式碼,特此記錄一下。
核心程式碼:
typedef struct{ char data; double weight;//權重 int parent; int lchild; int rchild; }HTNode; void CreateHT(HTNode ht[],int no)//no個葉子結點 { int i,k,lnode,rnode; double min1,min2; for(i=0;i<2*no-1;i++)//no個葉子結點的哈夫曼樹有2*no-1個結點,初始化 ht[i].parent=ht[i].lchild=ht[i].rchild=-1; for(i=no;i<=2*no-2;i++)//構造no-1個分支結點 { min1=min2=32767;//設為較大的數 lnode=rnode=-1;//lnode和rnode為最小權重的兩個結點位置 for(k=0;k<=i-1;k++) { if(ht[k].parent==-1) { if(ht[k].weight<minl) { min2=min1; rnode=lnode; min1=ht[k].weight; lnode=k; } else if(ht[k].weight<min2) { min2=ht[k].weight; rnode=k; } } } ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode; ht[i].rchild=rnode; ht[lnode].parent=i; ht[rnode].parent=i; } }
舉個栗子叭~(直接紙上模擬,來說明如何在尚未構造二叉樹的結點中尋找權值最小的兩個結點)
如初始結點為 1 7 3 5
在紙上寫了一些關鍵的程式碼,emmmm我知道既不簡潔也不美觀(還字醜)哈哈哈
(皮毛的ps技術學以致用hhh)
自己舉個例子手動模擬一下就能明白啦:
min1,lnode是分別記錄權值最小的結點的大小和下標
min2,rnode是記錄權值第二小的結點的大小和下標
且如果有比當前min1小的結點,那麼min2就會繼承之前記錄的那個min1的值(包括對應的lnode),再更新min1和lnode。
就醬~結束·