資料結構與演算法 哈夫曼樹(原始碼)!

2021-09-22 07:13:03 字數 3364 閱讀 3890

#include

<

iostream

>

#define

maxvalue 100000

using

namespace

std;

const

intn=4

;//葉子節點個數 

//構造哈夫曼樹結點 

typedef 

struct

hnodetype;

hnodetype hfmtree[2*

n-1];

//結點數 

//構造哈夫曼編碼陣列

typedef 

struct

hcodetype;

hcodetype hfmcode[n];

//建立哈夫曼樹 

void

createhfmtree(hnodetype hfmtree,

intn)

cout

<<

"請輸入結點權值:

"<<

endl; 

for(i=0

;i<

n;i++

)for(i=

0;i1;i++)

else

if(hfmtree[j].parent

==-1

&&hfmtree[j].weight

<

x2)}

hfmtree[m1].parent=n

+i;hfmtree[m2].parent=n

+i;hfmtree[n

+i].weight

=hfmtree[m1].weight

+hfmtree[m2].weight;

hfmtree[n

+i].lchild

=m1;

hfmtree[n

+i].rchild

=m2;}}

//轉化編碼 

void

createhfmcode(hnodetype hfmtree,hcodetype hfmcode)

for(j

=cd.start+1

;j<

n;j++

)hfmcode[i].bit[j]

=cd.bit[j];

hfmcode[i].start

=cd.start+1

;}}//

主函式 

intmain()

cout

<<

endl;

}return0;

}

這個是雛形,下面我們要實現的功能是,輸入乙個含有n位a,b,c,d四種字母的字串。

然後轉換成只含有0,1的**串。之所以要使用哈夫曼樹是因為哈夫曼樹是最優樹。根據權值來實現最短編碼。

下面是實現自動轉碼的程式:

#include

<

iostream

>

#define

maxvalue 100000

using

namespace

std;

const

intn=4

;//葉子節點個數 

string

l;int

size;

//構造哈夫曼樹結點 

typedef 

struct

hnodetype;

hnodetype hfmtree[2*

n-1];

//結點數 

//構造哈夫曼編碼陣列

typedef 

struct

hcodetype;

hcodetype hfmcode[n];

//建立哈夫曼樹 

void

createhfmtree(hnodetype hfmtree,

intn)

cout

<<

"*******************哈夫曼樹字串最優轉碼程式***********************

"<<

endl; 

cout

<<

"請輸入乙個字串:(只含有a,b,c,d四種字元,輸入回車結束)

"<<

endl; 

cin>>

l;std::

string

str(l);

size

=str.size();    

for(

inti=0

;i<

size;

++i)

}for(i=

0;i1;i++)

else

if(hfmtree[j].parent

==-1

&&hfmtree[j].weight

<

x2)}

hfmtree[m1].parent=n

+i;hfmtree[m2].parent=n

+i;hfmtree[n

+i].weight

=hfmtree[m1].weight

+hfmtree[m2].weight;

hfmtree[n

+i].lchild

=m1;

hfmtree[n

+i].rchild

=m2;}}

//轉化編碼 

void

createhfmcode(hnodetype hfmtree,hcodetype hfmcode)

for(j

=cd.start+1

;j<

n;j++

)hfmcode[i].bit[j]

=cd.bit[j];

hfmcode[i].start

=cd.start+1

;}}//

主函式 

intmain()k++

;cout

<<

endl;

}cout

<<

"轉碼後的字串為:

"<<

endl;

std::

string

str(l);

size

=str.size();    

for(

inti=0

;i<

size;

++i)

else

if(str.at(i)=='

b')else

if(str.at(i)=='

c')else

if(str.at(i)=='

d')else

}return0;

}

程式本機測試通過,可以放心執行!

資料結構與演算法 哈夫曼樹(原始碼)!

原文出處 這些天明白了乙個道理,搞技術也是需要激情的。也不知道為什麼這段過的感覺特別的不爽,也不知道是因為快要考試了,心裡沒底,而帶來的恐懼,還是 搞技術太久,心裡想放個假,總之是過的暈暈乎乎,做事情也總是反應遲鈍,思維也不快,我爸媽說我是因為睡 不夠,但是我覺得我一晚上睡6個半小時,也不算短了。真...

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

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

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

include pch.h include 哈夫曼樹類huffmantree的定義 huffman樹結點類treenode宣告 template class t class huffmannode 建構函式 huffmannode getleft void const void setleft hu...