南邮哈夫曼编码和译码系统Word文档下载推荐.docx

上传人:b****5 文档编号:16481367 上传时间:2022-11-24 格式:DOCX 页数:22 大小:142.86KB
下载 相关 举报
南邮哈夫曼编码和译码系统Word文档下载推荐.docx_第1页
第1页 / 共22页
南邮哈夫曼编码和译码系统Word文档下载推荐.docx_第2页
第2页 / 共22页
南邮哈夫曼编码和译码系统Word文档下载推荐.docx_第3页
第3页 / 共22页
南邮哈夫曼编码和译码系统Word文档下载推荐.docx_第4页
第4页 / 共22页
南邮哈夫曼编码和译码系统Word文档下载推荐.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

南邮哈夫曼编码和译码系统Word文档下载推荐.docx

《南邮哈夫曼编码和译码系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《南邮哈夫曼编码和译码系统Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。

南邮哈夫曼编码和译码系统Word文档下载推荐.docx

template〈classT〉

classBinaryTree{

public:

BinaryTree(){

root=NULL;

~BinaryTree(){}

boolisEmpty()const{

returnroot==NULL;

voidclear(){

postClear(root);

}

boolretRoot(T&

x)const;

voidmakeTree(const&x,BinaryTree<

T>

&left,BinaryTree〈T〉&

right);

voidbreakTree(T&x,BinaryTree〈T>

&

left,BinaryTree<

voidpreOrder(){

preOrder(root);

voidinOrder(){

inOrder(root);

voidpostOrder(){

postOrder(root);

BTNode〈T>

*copy(BTNode<

*t);

intsize(){

returnsize(root);

voidchange(){

change(root);

voidbreathFirst(){

breathFirst(root);

intheight(){

returnheight(root);

voidleaf(){

prePrint(root);

protected:

BTNode〈T〉*root;

private:

voidclear(BTNode<

T〉*t);

voidchange(BTNode<

*t);

voidpostClear(BTNode<

T〉*t);

voidprePrint(BTNode<

*t);

intsize(BTNode〈T〉*t);

intheight(BTNode〈T>

*t);

voidpreOrder(BTNode<

*t);

voidinOrder(BTNode〈T〉*t);

voidpostOrder(BTNode〈T>

voidbreathFirst(BTNode<

voidvisit(T&x){

cout<

〈x〈〈”"

template〈classT>

boolBinaryTree<

:

retRoot(T&

x)const{

if(root){

x=root-〉element;

returntrue;

}elsereturnfalse;

}

classT〉

voidBinaryTree〈T〉:

makeTree(const&x,BinaryTree〈T〉&left,BinaryTree<

&right){

if(root||&left==&right)return;

root=newBTNode<

(x,left。

root,right.root);

left.root=right.root=NULL;

voidBinaryTree<

breakTree(T&

x,BinaryTree<

left,BinaryTree〈T〉&

right){

if(!

root||&left==&right||left.root||right。

root)return;

x=root-〉element;

left.root=root-〉lChild;

right。

root=root—〉rChild;

deleteroot;

root=NULL;

classT〉

voidBinaryTree〈T〉:

preOrder(BTNode<

*t){

if(t){

visit(t—〉element);

preOrder(t-〉lChild);

preOrder(t—>

rChild);

inOrder(BTNode<

T〉*t){

if(t){

inOrder(t-〉lChild);

inOrder(t—>

postOrder(BTNode<

T〉*t){

postOrder(t->

lChild);

rChild);

visit(t—>

element);

template〈classT〉

clear(BTNode〈T>

deletet;

t=NULL;

postClear(BTNode〈T>

*t){

postClear(t—>

deletet;

BTNode<

*BinaryTree〈T>

copy(BTNode〈T〉*t){

if(!

t)returnNULL;

*q=newBTNode<

(t-〉element);

q-〉lChild=copy(t—>

q—〉rChild=copy(t—>

returnq;

intBinaryTree〈T〉:

size(BTNode<

t)return0;

elsereturnsize(t—>

lChild)+size(t-〉rChild);

voidBinaryTree〈T>

change(BTNode<

T〉*t){

t)return;

T〉*q=copy(t—>

clear(t->

t-〉rChild=t-〉lChild;

t—>

lChild=q;

change(t—>

lChild);

change(t—〉rChild);

breathFirst(BTNode<

t)return;

queue<

BTNode〈T〉*>

q1;

q1.push(t);

*node;

while(!

q1.empty()){

node=q1。

front();

visit(node—〉element);

q1.pop();

if(node—>

lChild)q1。

push(node->

if(node—>

rChild)q1。

push(node—>

intBinaryTree<

T〉:

height(BTNode〈T〉*t)

{

if(t==NULL)return0;

else

{

intm=height(t->

lChild);

intn=height(t—〉rChild);

return(m>

n)?

(m+1):

(n+1);

}

prePrint(BTNode〈T〉*t){

if((t—>

lChild==NULL)&

(t-〉rChild==NULL)){

visit(t—>

return;

prePrint(t—〉lChild);

prePrint(t—>

classPrioQueue{

PrioQueue(intmSize=20);

~PrioQueue(){delete[]q;

boolIsEmpty()const{returnn==0;

boolIsFull()const{returnn==maxSize;

voidAppend(constT&

x);

voidServe(T&x);

private:

voidAdjustDown(intr,intj);

voidAdjustUp(intj);

T*q;

intn,maxSize;

};

PrioQueue<

PrioQueue(intmSize){

maxSize=mSize;

n=0;

q=newT[maxSize];

voidPrioQueue〈T〉:

AdjustUp(intj){

inti=j;

Ttemp=q[i];

while(i〉0&&

temp〈q[(i—1)/2]){

q[i]=q[(i—1)/2];

i=(i-1)/2;

q[i]=temp;

voidPrioQueue<

T〉:

Append(constT&x)

if(IsFull()){

cout<

〈"

Overflow”;

return;

q[n++]=x;

AdjustUp(n-1);

Serve(T&x)

{

if(IsEmpty()){

cout〈〈”Underflow”;

return;

x=q[0];

q[0]=q[——n];

AdjustDown(0,n-1);

AdjustDown(intr,intj){

intchild=2*r+1;

Ttemp=q[r];

while(child<

=j){

if((child〈j)&

(q[child]〉q[child+1]))child++;

if(temp〈=q[child])break;

q[(child-1)/2]=q[child];

child=2*child+1;

q[(child—1)/2]=temp;

classHfmTree:

publicBinaryTree<

operatorT()const{returnweight;

TgetW(){returnweight;

voidputW(constT&

x){

weight=x;

}

voidSetNull(){root=NULL;

voidcode(string&c){

code(root,c);

voiddecode(strings);

Tweight;

voidcode(BTNode<

*t,string&c);

};

voidHfmTree<

decode(stringdecodeString){

if(codeArray==NULL){

cout〈<

”尚未编码!

”<

〈endl;

return;

T〉*searchNode=root;

for(inti=0;

i<

decodeString。

length();

i++){

if(decodeString[i]!

='

0’&&decodeString[i]!

=’1'

){

<

"

所给码格式不正确!

"

<

endl;

return;

if(searchNode—〉lChild==NULL&

&searchNode—>

rChild==NULL){

Tvalue=searchNode—>

element;

for(intj=0;

j〈s.length();

j++){

if(value==weightArray[j]){

cout〈〈s[j];

break;

}

searchNode=root;

if(decodeString[i]=='

0'

)searchNode=searchNode—〉lChild;

if(decodeString[i]=='

1'

)searchNode=searchNode—〉rChild;

if(searchNode—>

lChild==NULL&

searchNode—〉rChild==NULL){

Tvalue=searchNode->

element;

for(intj=0;

j<

s。

j++){

if(value==weightArray[j]){

cout<

s[j];

cout<

〈endl;

voidHfmTree〈T〉:

code(BTNode〈T>

*t,string&c){

if(t->

lChild==NULL&&t->

for(inti=0;

if(t-〉element==weightArray[i]){

codeArray[i]=c;

//cout<

NO"

〈〈i<

〈”"

cout〈<

字符"

〈<

s[i]<

〈”的权重是”<

weightArray[i]<

哈弗曼编码是”〈<

codeArray[i]<

endl;

}

if(t—>

lChild!

=NULL){

stringls;

ls。

assign(c);

append("

0"

);

code(t->

lChild,ls);

if(t->

rChild!

stringrs;

rs。

rs.append("

1”);

rChild,rs);

HfmTree<

CreateHfmTree(T*w,intn){

PrioQueue〈HfmTree〈T>

>

pq(n);

//空优先权队列

HfmTree〈T〉x,y,z;

//空哈夫曼树

for(inti=0;

i<

n;

i++){//构造n棵只有一个结点的哈夫曼树

z。

makeTree(w[i],x,y);

z.putW(w[i]);

pq.Append(z);

z。

SetNull();

for(i=1;

i〈n;

i++){

pq.Serve(x);

//取出最小权值的哈夫曼树对象x

pq.Serve(y);

//取出最小权值的哈夫曼树对象y

makeTree(x。

getW()+y。

getW(),x,y);

z.putW(x。

getW()+y.getW());

pq.Append(z);

SetNull();

pq。

Serve(z);

returnz;

voidinput(HfmTree<

int〉&p){

cout〈<

请输入需要编码的字符组成的字符串:

;

cin>

>

s;

weightArray=newint[s。

length()];

codeArray=newstring[s。

i〈s。

”请输入第”〈〈(i+1)<

个字符的权值:

”〈<

cin〉>

weightArray[i];

p=CreateHfmTree(weightArray,s.length());

//p。

postOrder();

voidcreateCode(HfmTree<

int〉&p){

if(codeArray==NULL){

cout〈〈”树为空!

return;

stringc;

p.code(c);

voidencode(){

cout<

尚未编码!

〈〈endl;

return;

stringencodeString;

cout〈〈”请输入需要编码的字符串:

”;

〉encodeString;

\n经过编码的码值为:

for(inti=0;

encodeString.length();

for(intj=0;

j〈s.length();

if(s[j]==encodeString[j]){

cout<

〈codeArray[j];

break;

cout〈〈endl;

voidmain(){

boolflag=true;

HfmTree<

int〉p;

stringdecodeString;

while(flag){

cout〈〈"

B——建树”〈〈"

T—-遍历"

E--生成编码"

”C——编码"

D——译码”<

〈”X——退出"

请输入指令:

”;

charc;

cin〉〉c;

switch(c){

case'

B'

input(p);

case’T’:

if(p!

〈”前序遍历:

p。

preOrder();

cout〈<

”中序遍历:

inOrder();

cout〈〈”后序遍历:

postOrder();

广度优先遍历:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 日语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1