如何建立一棵哈夫曼樹並且輸出壓縮碼

2021-06-26 02:44:25 字數 1367 閱讀 1031

如何建立一棵哈夫曼樹並且輸出壓縮碼

演算法: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個結...