資料結構 樹及其應用 哈夫曼編碼

2021-10-02 15:09:13 字數 3122 閱讀 4832

樹和二叉樹是一類應用極為廣泛的資料結構。通過本次實驗使學生不僅了解樹和二叉樹的結構特性及其基本操作的實現過程,同時掌握他們在實際問題背景下的應用。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define max 1000

//哈夫曼樹最大結點個數

#define maxw 1000

//權值最大

using

namespace std;

//哈夫曼樹結點結構

typedef

struct hnode

hnode;

//編碼結構

typedef

struct hcnode

;//兩個最小結點下標

typedef

struct minnodes

;//輔助標誌陣列 標記該結點為根的樹是否已加入哈夫曼樹

bool flag[max]=;

hnode ht[max]

;//哈夫曼樹

hcnode hc[max]

;//哈夫曼編碼陣列

//選擇兩棵最小權值的樹 引數max,當前有權值結點下標+1

minnodes select

(int max)

} flag[mins.m1]

=true

;//將結點加入哈夫曼樹

min = maxw;

//查詢第二個最小權值結點下標,可能不存在

for(

int i =

0;i < max;i++)}

flag[mins.m2]

=true

;//將結點加入哈夫曼樹if(

-1== mins.m2)

//僅剩餘乙個結點未加入哈夫曼樹

else

return mins;

}//列印哈夫曼樹

void

printht

(int max)

}//列印編碼

void

printhc

(int n)

}//建立哈夫曼樹

void

createht()

/* ht[0].data = 'a';ht[0].weight = 45;ht[0].lchild = -1;ht[0].rchild = -1;

ht[1].data = 'b';ht[1].weight = 13;ht[1].lchild = -1;ht[1].rchild = -1;

ht[2].data = 'c';ht[2].weight = 12;ht[2].lchild = -1;ht[2].rchild = -1;

ht[3].data = 'd';ht[3].weight = 16;ht[3].lchild = -1;ht[3].rchild = -1;

ht[4].data = 'e';ht[4].weight = 9; ht[4].lchild = -1;ht[4].rchild = -1;

ht[5].data = 'f';ht[5].weight = 5; ht[5].lchild = -1;ht[5].rchild = -1;*/

int i = n;

for(

;;i++

) ht[i]

.weight = ht[mins.m1]

.weight + ht[mins.m2]

.weight;

//新加入哈夫曼樹結點為兩個結點權值之和

ht[i]

.data =

' ';

ht[mins.m1]

.parent = i;

//兩個權值最小結點雙親為新加入結點

ht[mins.m2]

.parent = i;

ht[i]

.lchild = mins.m1;

//左小又大

ht[i]

.rchild = mins.m2;

}printht

(i);

//列印哈夫曼樹

}//哈夫曼樹編碼

void

code()

else

j = ht[j]

.parent;

}reverse

(str.

begin()

,str.

end())

;//逆序

hc[i]

.code = str;

//儲存至編碼

if(ht[i]

.lchild ==-1

&& ht[i]

.rchild ==-1

)continue

;//非葉子不編碼

else

break;}

printhc

(i);

}//哈夫曼樹解碼 從根開始,左0右1,直至葉節點

void

encode()

else

if(ht[j]

.lchild ==-1

&& ht[j]

.rchild ==-1

)//到達葉節點

} cout << endl;

}//計算wpl

void

wpl(

) cout <<

"wpl:"

<< wpl << endl;

}//選單

void

menu()

//主函式

資料結構 哈夫曼樹 哈夫曼編碼

哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...

哈夫曼編碼 哈夫曼樹 (資料結構)

哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...

資料結構 哈夫曼樹與哈夫曼編碼

1 路徑 由乙個結點到另乙個結點之間的所有分支共同構成。2 路徑長度 結點之間的分支數目。3 樹的路徑長度 從樹的根結點到其他所有結點的路徑長度之和。4 權 賦予某一實體的值。在資料結構中,實體包括結點和邊,所以對應有結點權和邊權。5 結點的帶權路徑長度 結點與樹的根結點之間的路徑長度與結點權的乘積...