如何建立一棵哈夫曼樹並且輸出壓縮碼
演算法:1
、給定乙個具有
n個權值
的結點的集合
f = 2
、初始時,設集合
a = f。3
、執行i = 1
至n -1
的迴圈,在每次迴圈時執行以下操作
從當前集合中選取權值最小、次最小的兩個結點,以這兩個結點作為內部結點
bi的左右兒子,
bi的權值為其左右兒子權值之和。
在集合中去除這兩個權值最小、次最小的結點,並將內部結點
bi加入其中。這樣,在集合
a中,結點個數便減少了乙個。
這樣,在經過了
n-1次迴圈之後,集合
a中只剩下了乙個結點,這個結點就是根結點。
哈夫曼樹的儲存:在哈夫曼樹中,每個要編碼的元素是乙個葉結點(度數為零),其它結點都是度數(度數就是有多少個子節點)為
2的節點
一旦給定了要編碼的元素個數,由n0=
n2+1可知哈夫曼樹的大小為
2n-1
哈夫曼樹可以用乙個大小為
2n的陣列來儲存。
0節點不用,根存放在節點
1。葉結點依次放在
n+1到
2n的位置
每個陣列元素儲存的資訊:結點的資料、權值和父結點和左右孩子的位置。
**實現: //
哈夫曼樹及其編碼,兩個結構體,第乙個是用來構造哈夫曼樹的,第二個是用來儲存壓縮碼的
#includeusing namespace std;
struct hfnode
;struct node
;struct node *hftree(char str,int d,int size)
else if(min2>hf[j].weight&&hf[j].parent==0)
}if(x>y)
swap(x,y);
hf[i].weight=min1+min2;//新的節點的形成
hf[i].parent=0;
hf[i].left=x;
hf[i].right=y;
hf[x].parent=i;
hf[y].parent=i;
}for(i=size; i0)
}return p;
}int main()
//c陣列中儲存的是各個字元的權值(也就是個數)
temp=hftree(str,c,size);
for(i=0; i=0; j--)
printf("%c",temp[i].a[j]);
printf("\n");}}
}return 0;
}
建立一棵二叉樹 輸出前序
洛谷 p1305 輸入一串二叉樹,用遍歷前序打出。第一行為二叉樹的節點數n。n leq 26n 26 後面n行,每乙個字母為節點,後兩個字母分別為其左右兒子。空節點用 表示 6abc bdicj d i j 輸出 abdicj 思路 建立乙個節點包含父節點 左兒子 右兒子 的節點 有父節點可以判斷誰...
基礎向 如何輸出一棵漂漂亮亮的樹
在搞編譯原理實驗的時候,最後要求輸出一棵漂漂亮亮的語法樹,便突然想起了二叉樹輸出這個在初學程式設計時困擾過我的問題,索性就在這裡把它解決了吧。ps 對於只是想明白怎麼輸出樹的同學,部落格中編譯原理相關的知識可以自行跳過。先來看看最終效果 應該能滿足大部分人的要求 符號是用string定義的,如果有長...
如何逐層建立一棵滿二叉樹?
洋蔥 如果你願意一層一層的剝開我的心 會發現 會流淚 我就是你失散多年的二叉樹啊 幾個要點 1.來自 lm whales struct p 結構體指標型別 struct 強制轉換成結構體指標型別 malloc sizeof struct 結構體的大小 2.來自 2015年資料結構聯考複習指導 n個結...