南邮哈夫曼编码和译码系统Word文档下载推荐.docx
《南邮哈夫曼编码和译码系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《南邮哈夫曼编码和译码系统Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
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();
广度优先遍历: