分享

数据结构实验,哈夫曼编码/译码系统

 饮茶仙人 2016-05-19

1. 实验名称: 二叉树的基本操作及哈夫曼编码译码系统的实现

 

2.实验目的

创建一棵二叉树,实现先序、中序和后序遍历一棵二叉树,计算二叉树结点个数等操作。哈夫曼编码/译码系统。

 

3. 实验任务

       能成功演示二叉树的有关运算,运算完毕后能成功释放二叉树所有结点占用的系统内存。

 

4. 实验内容

  (1)在二叉链表上实现二叉树运算

a)        设计递归算法,实现二叉树的基本运算:删除一棵二叉树,求一棵二叉树的高度,求一棵二叉树中叶子结点数,复制一棵二叉树,交换一棵二叉树的左右子树。

b)       设计算法,按自上到下,自左到右的次序,即按层次遍历一棵二叉树。

c)        设计main函数,测试上述每个运算。

d)       提示:队列结构可以辅助进行层次遍历,队列的元素类型是指向二叉树结点的指针类型。

(2)哈夫曼编码和译码系统

a)        设计一个菜单可以循环显示

B——建树:读入字符集和各字符频度,建立哈夫曼树。

T——遍历:先序和中序遍历二叉树。

E——生成编码:产生每个字符的哈夫曼编码。

C——编码:输入由字符集中字符组成的任意字符串,利用已经生成的哈夫曼编码进行编码,显示编码结果。

D——译码:利用已建成的哈夫曼树进行译码。

X——退出。

b)  提示:修改二叉树结点类BTNode,增加一个指向双亲的parent域,修改二叉树类

的函数MakeTree设置该域的值;可以通过遍历哈夫曼树生成每个叶子结点的哈夫曼编码。

 

5. 概要设计

1)       二叉树

首先定义结点类BTNode包括对结点的访问,打印,交换结点左右元素等操作。并将二叉树类BTree声明为友元类。二叉树类中包含了建树,判断二叉树是否为空,求结点数,求高度,删除,交换左右子树,三种次序遍历及按层次遍历,清空二叉树等函数。在主函数中调用实现这些功能。

 

类和类的层次设计

BTNode

BTree

T element;

    BTNode<T> *lchild, *rchild;

BTNode<T>* root;

friend class BTree<T>;

friend void Visit(BTNode<T>*p);

friend void Print(BTNode<T>*p);

friend void ex(BTNode<T>*p);

bool IsEmpty()const;

bool Root(T &x)const;

void MakeTree(const T &e ,BTree<T>& left, BTree<T>& right);

void BreakTree(T &e ,BTree<T>& left,BTree<T>& right);

void PreOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t);

void InOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t);

void PostOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t);

int Size(BTNode<T>* t);

int GetHeight(BTNode<T>* t);

void BfsOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t);

void Change(BTNode<T> *t);

void Clear(BTNode<T> *t);

主要算法:

PreOrder:输出当前结点元素,左右孩子递归调用函数。

InOrder:左孩子递归调用函数,输出当前结点元素,右孩子递归调用。

PostOrder:左右孩子递归调用函数,输出当前结点元素。

BfsOrder:使用一个队列结构,队列元素是指向结点的指针,将当前结点入队,当队列元素没有全部出队时,队头元素出队,如果有左右孩子,左右孩子进队,循环该操作。

Change:左右孩子递归调用函数,交换当前结点左右孩子。


2)       哈夫曼树

首先定义优先权队列的类PrioQueue,实现Append及Serve,这样就可以实现哈夫曼树的构建。其次修改二叉树结点类BTNode,在增加指向双亲的parent域,修改二叉树类MakeTree函数设置该域的值。在二叉树类中添加编码译码等函数。

类和类的层次设计:

BTree

PrioQueue

HfmTree:public BTree

T *q;

int n,maxSize;

T weight;

void CreatCode(BTNode<T>*t);//生成哈夫曼编码

String2Code(BTNode<T>*t,char *s);//翻译成哈夫曼码

Code2String(BTNode<T> *t,char code[],int &i,int l)//从哈夫曼码译出原字符串

void AdjustDown(int r,int j);

void AdjustUp(int j);

bool IsEmpty() const

bool IsFull() const

void Append(const T &x);

void Serve(T &x);

operator T()const;

T getW();

void putW(const T& x);

void SetNull();

主要算法:

AdjustDown:向下调整q[r]。设tmp=q[r],如果tmo大于左右孩子中的最小者,则与该结点交换,依次往下直到不需要调整或到达队列底部。

AdjustUp:该函数与AdjustDown相反,从下往上,与双亲结点比较,如果双亲结点大,则调整,知道双亲结点不再大或者已经到达顶部。

CreatHfmTree:首先构造n棵哈夫曼树对象,每棵树只有一个权值为w[i]的根节点,且该对象的weight为w[i],将其逐一加入优先权队列。从优先权队列中取出两棵根节点值最小和次小的哈夫曼树x,y。以它们根的权值之和为根的权值,x,y为左右子树构造一棵新哈夫曼树,将新树对象进优先权队列。重复执行n-1次,此时队列中只剩下合并完成的哈夫曼树。从队列中取出构造完成的哈夫曼树,函数返回该哈夫曼树。

CreatCode:首先从根节点开始,每个节点增加项int hfm[],bit,存储从根节点到该节点的路径,则子孩子的hfm就在双亲节点的hfm[]上增加一个,如果是左孩子则最后一位是0,右孩子就是1。然后递归遍历哈夫曼树,如果是叶子节点就输出其hfm[]。

String2Code:每个结点增加一个项ch存储对应的字幕,如果不是叶子就存’0’,依次比较输入的串的每一个字符,如果叶子节点有就输出该节点的hfm[]。

Code2String:依次读入哈夫曼码,如果是0就往左孩子走,如果是1就往右孩子走,直到走到叶子节点,输出字符。


code:

  1. //BTNode.h  
  2. #include<iostream>  
  3. #include<cstring>  
  4. #include<cmath>  
  5. #include<string>  
  6. #include<cstdlib>  
  7. using namespace std;  
  8. template <class T>  
  9. class BTree;  
  10. template <class T>  
  11. class BTNode  
  12. {  
  13.     public:  
  14.         BTNode()  
  15.         {  
  16.             lchild=rchild=parent=0;  
  17.             ch='0';  
  18.         }  
  19.         BTNode(const T& e)  
  20.         {  
  21.             ch='0';  
  22.             element=e;  
  23.             lchild=rchild=parent=0;  
  24.             memset(hfm,-1,sizeof(hfm));  
  25.         }  
  26.         BTNode(const T& e,const char c,BTNode<T> *l,BTNode<T> *r)  
  27.         {  
  28.             element=e;  
  29.             ch=c;  
  30.             lchild=l;  
  31.             rchild=r;  
  32.             parent=0;  
  33.             memset(hfm,-1,sizeof(hfm));  
  34.         }  
  35.         T element;  
  36.         char ch;  
  37.         int hfm[50],bit;  
  38.         BTNode<T> *lchild, *rchild,*parent;  
  39.         friend class BTree<T>;  
  40.         friend void Visit(BTNode<T>*p);  
  41.         friend void Print(BTNode<T>*p);  
  42.         friend void ex(BTNode<T>*p);  
  43. };  
  44.   
  45. template <class T>  
  46. void Visit(BTNode<T>* p)  
  47. {  
  48.     cout<<p->element<<"  ";  
  49. }  
  50.   
  51. template <class T>  
  52. void ex(BTNode<T>* p)  
  53. {  
  54.     BTNode<T> *tmp;  
  55.     tmp=p->lchild;  
  56.     p->lchild=p->rchild;  
  57.     p->rchild=tmp;  
  58. }  

  1. //BTree.h  
  2. #include "BTNode.h"  
  3. #include<iostream>  
  4. using namespace std;  
  5. template<class T>  
  6. class BTree  
  7. {  
  8.     public:  
  9.         BTree(){root=NULL;i=-1;}  
  10.         ~BTree(){}  
  11.         bool IsEmpty()const;  
  12.         bool Root(T &x)const;  
  13.         void MakeTree(const T &e ,const char c,BTree<T>& left,BTree<T>& right);  
  14.         void BreakTree(T &e ,BTree<T>& left,BTree<T>& right);  
  15.         int Size()  
  16.         {  
  17.             return Size(root);  
  18.         }  
  19.         int GetHeight()  
  20.         {  
  21.             return GetHeight(root);  
  22.         }  
  23.         void PreOrder(void (*Visit)(BTNode<T>* u))  
  24.         {  
  25.             PreOrder(Visit,root);  
  26.         }  
  27.         void InOrder(void (*Visit)(BTNode<T>* u))  
  28.         {  
  29.             InOrder(Visit,root);  
  30.         }  
  31.         void PostOrder(void (*Visit)(BTNode<T>* u))  
  32.         {  
  33.             PostOrder(Visit,root);  
  34.         }  
  35.         void BfsOrder(void (*Visit)(BTNode<T>* u))  
  36.         {  
  37.             BfsOrder(Visit,root);  
  38.         }  
  39.         void CreatCode()  
  40.         {  
  41.             CreatCode(root,i);  
  42.         }  
  43.         void PrintCode()  
  44.         {  
  45.             PrintCode(root);  
  46.         }  
  47.         void Character2Code(char ch)  
  48.         {  
  49.             Character2Code(root,ch);  
  50.         }  
  51.         void String2Code()  
  52.         {  
  53.             String2Code(root);  
  54.         }  
  55.         void Code2String()  
  56.         {  
  57.             Code2String(root);  
  58.         }  
  59.         void Exch()  
  60.         {  
  61.             Change(root);  
  62.         }  
  63.         void Clear()  
  64.         {  
  65.             Clear(root);  
  66.         }  
  67.    protected:  
  68.        int i;  
  69.        BTNode<T>* root;  
  70.    private:  
  71.         void PreOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t);  
  72.         void InOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t);  
  73.         void PostOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t);  
  74.         void BfsOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t);  
  75.         void CreatCode(BTNode<T>* t,int i);  
  76.         void PrintCode(BTNode<T>* t);  
  77.         void Character2Code(BTNode<T>* t,char ch);  
  78.         void String2Code(BTNode<T>* t);  
  79.         void Code2String(BTNode<T>* t);  
  80.         int Size(BTNode<T>* t);  
  81.         int GetHeight(BTNode<T>* t);  
  82.         void Change(BTNode<T> *t);  
  83.         void Clear(BTNode<T> *t);  
  84. };  
  85. //二叉树的节点数  
  86. template <class T>  
  87. int BTree<T>::Size(BTNode<T>* t)  
  88. {  
  89.     if(!t)  
  90.         return 0;  
  91.     else  
  92.         return Size(t->lchild)+Size(t->rchild)+1;  
  93. }  
  94. //返回二叉树的高度  
  95. template<class T>  
  96. int BTree<T>::GetHeight(BTNode<T>* t)  
  97. {  
  98.     int templ;  
  99.     int tempr;  
  100.     if(!t)  
  101.         return 0;  
  102.     templ=GetHeight(t->lchild);  
  103.     tempr=GetHeight(t->rchild);  
  104.     if(templ++>tempr++)  
  105.         return templ;  
  106.     else  
  107.         return tempr;  
  108. }  
  109. //判断二叉树是否为空  
  110. template <class T>  
  111. bool BTree<T>::IsEmpty() const  
  112. {  
  113.     return root==NULL;  
  114. }  
  115. //根节点是否赋值  
  116. template <class T>  
  117. bool BTree<T>::Root(T &x) const  
  118. {  
  119.     if (root)  
  120.     {  
  121.         x=root->element;  
  122.         return true;  
  123.     }  
  124.     else return false;  
  125. }  
  126. //合并两棵二叉树  
  127. template <class T>  
  128. void BTree<T>::MakeTree(const T &e,const char c,BTree<T>& left,BTree<T>& right)  
  129. {  
  130.     //cout<<"here in BTree<T>::MakeTree"<<endl;  
  131.     int i=0;  
  132.     if(root||&left==&right) return;  
  133.     root=new BTNode<T>(e,c,left.root,right.root);  
  134.     if(left.root!=right.root)  
  135.     {  
  136.         left.root->parent=root;  
  137.         right.root->parent=root;  
  138.         left.root->bit=0;  
  139.         right.root->bit=1;  
  140.     }  
  141.     left.root=right.root=NULL;  
  142. }  
  143. //拆分一棵二叉树  
  144. template <class T>  
  145. void BTree<T>::BreakTree(T &e,BTree<T>&left, BTree<T>& right)  
  146. {  
  147.     cout<<"here in BTree<T>::BreakTree."<<endl;  
  148.     if(!root||&left==&right||left.root||right.root) return;  
  149.     e=root.element; left.root=root.lchild; right.root=root.rchild;  
  150.     delete root;  
  151.     root=NULL;  
  152. }  
  153. //先序遍历二叉树  
  154. template <class T>  
  155. void BTree<T>::PreOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)  
  156. {  
  157.     if(t)  
  158.     {  
  159.         Visit(t);  
  160.         PreOrder(Visit,t->lchild);  
  161.         PreOrder(Visit,t->rchild);  
  162.     }  
  163. }  
  164. //中序遍历二叉树  
  165. template <class T>  
  166. void BTree<T>::InOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)  
  167. {  
  168.     if (t)  
  169.     {  
  170.         InOrder(Visit,t->lchild);  
  171.         Visit(t);  
  172.         InOrder(Visit,t->rchild);  
  173.     }  
  174. }  
  175. //后序遍历二叉树  
  176. template <class T>  
  177. void BTree<T>::PostOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)  
  178. {  
  179.     if (t)  
  180.     {  
  181.         PostOrder(Visit,t->lchild);  
  182.         PostOrder(Visit,t->rchild);  
  183.         Visit(t);  
  184.     }  
  185. }  
  186. //层次遍历即宽度优先遍历二叉树  
  187. template <class T>  
  188. void BTree<T>::BfsOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)//?t2?ê÷2?′?±éàú  
  189. {  
  190.     int front=0,rear=0;  
  191.     BTNode<T>* q[100];  
  192.     q[rear++]=t;  
  193.     while(front<rear)  
  194.     {  
  195.         BTNode<T>* u=q[front++];  
  196.         if(!u) return;  
  197.         Visit(u);  
  198.         if(u->lchild) q[rear++]=u->lchild;  
  199.         if(u->rchild) q[rear++]=u->rchild;  
  200.     }  
  201. }  
  202. //生成哈夫曼编码  
  203. template <class T>  
  204. void BTree<T>::CreatCode(BTNode<T>* t,int i)  
  205. {  
  206.     if(t)  
  207.     {  
  208.         if(t->parent)  
  209.         {  
  210.             for(int j=0;j<=i;j++)  
  211.                 t->hfm[j]=t->parent->hfm[j];  
  212.             t->hfm[++i]=t->bit;  
  213.         }  
  214.         CreatCode(t->lchild,i);  
  215.         CreatCode(t->rchild,i);  
  216.         i--;  
  217.     }  
  218. }  
  219. //遍历打印哈夫曼编码  
  220. template <class T>  
  221. void BTree<T>::PrintCode(BTNode<T>* t)  
  222. {  
  223.     int i=0;  
  224.     if(t)  
  225.     {  
  226.         if(!t->lchild&&!t->rchild)  
  227.         {  
  228.             cout<<"\t"<<t->ch<<":";  
  229.             while(t->hfm[i]!=-1) cout<<t->hfm[i++];  
  230.             cout<<endl;  
  231.         }  
  232.         PrintCode(t->lchild);  
  233.         PrintCode(t->rchild);  
  234.     }  
  235. }  
  236. //翻译单个字符的哈夫曼码  
  237. template <class T>  
  238. void BTree<T>::Character2Code(BTNode<T>* t,char ch)  
  239. {  
  240.     int i=0;  
  241.     if(t)  
  242.     {  
  243.         if(t->ch==ch)  
  244.         {  
  245.             while(t->hfm[i]!=-1) cout<<t->hfm[i++];  
  246.             return;  
  247.         }  
  248.         Character2Code(t->lchild,ch);  
  249.         Character2Code(t->rchild,ch);  
  250.     }  
  251. }  
  252. //输入字符串并译成哈夫曼码  
  253. template <class T>  
  254. void BTree<T>::String2Code(BTNode<T>* t)  
  255. {  
  256.     char s[100];  
  257.     int len;  
  258.     cout<<"输入由任意字符组成的串:";  
  259.     cin>>s;  
  260.     len=strlen(s);  
  261.     cout<<"生成的哈夫曼码为:";  
  262.     for(int i=0;i<len;i++)  
  263.         Character2Code(root,s[i]);  
  264.     cout<<endl;  
  265. }  
  266. //输入哈夫曼码并译成字符  
  267. template <class T>  
  268. void BTree<T>::Code2String(BTNode<T>* t)  
  269. {  
  270.     char code;  
  271.     BTNode<T> *tmp=t;  
  272.     cout<<"输入哈夫曼码:";  
  273.     while(cin>>code)  
  274.     {  
  275.         if(t->ch=='0')  
  276.         {  
  277.             if(code=='0') t=t->lchild;  
  278.             else t=t->rchild;  
  279.         }  
  280.         else  
  281.         {  
  282.             cout<<t->ch;  
  283.             t=tmp;  
  284.         }  
  285.     }  
  286.     cout<<endl;  
  287. }  
  288. //镜像交换左右子树  
  289. template <class T>  
  290. void BTree<T>::Change(BTNode<T> *t)  
  291. {  
  292.     if (t)  
  293.     {  
  294.         Change(t->lchild);  
  295.         Change(t->rchild);  
  296.         ex(t);  
  297.     }  
  298. }  
  299. //清空这棵二叉树  
  300. template <class T>  
  301. void BTree<T>::Clear(BTNode<T> *t)  
  302. {  
  303.     if(!t) return;  
  304.     Clear(t->lchild);  
  305.     Clear(t->rchild);  
  306.     delete(t);  
  307. }  


  1. //BTreemain.cpp  
  2. #include"BTree.h"  
  3. int main(){  
  4.     BTree<char> d,e,f,b,c,a,left,right;  
  5.     d.MakeTree('D',left,right);  
  6.     e.MakeTree('E',left,right);  
  7.     f.MakeTree('F',left,right);  
  8.     b.MakeTree('B',left,d);  
  9.     c.MakeTree('C',e,f);    //先叶子,再根节点。  
  10.     a.MakeTree('A',b,c);  
  11.     cout<<"Size..."<<endl;  
  12.     cout<<a.Size()<<endl;  
  13.     cout<<"Height..."<<endl;  
  14.     cout<<a.GetHeight()<<endl;  
  15.     cout<<"PreOrder..."<<endl;  
  16.     a.PreOrder(Visit);  
  17.     cout<<'\n'<<"InOrder..."<<endl;  
  18.     a.InOrder(Visit);  
  19.     cout<<'\n'<<"PostOrder..."<<endl;  
  20.     a.PostOrder(Visit);  
  21.     cout<<'\n'<<"BfsOrder..."<<endl;  
  22.     a.BfsOrder(Visit);  
  23.     a.Exch();  
  24.     cout<<'\n'<<"later"<<endl;  
  25.     a.PreOrder(Visit);  
  26.     cout<<'\n'<<"Clear..."<<endl;  
  27.     a.Clear();  
  28.     cout<<"OK..."<<endl;  
  29.     return 0;  
  30. }  


  1. //PrioQueue.h  
  2. template <class T>  
  3. class PrioQueue  
  4. {  
  5. public:  
  6.     PrioQueue(int mSize=20);  
  7.     ~PrioQueue()  
  8.     {  
  9.         delete[] q;  
  10.     }  
  11.     bool IsEmpty() const  
  12.     {  
  13.         return n==0;  
  14.     }  
  15.     bool IsFull() const  
  16.     {  
  17.         return n==maxSize;  
  18.     }  
  19.     void Append(const T &x);  
  20.     void Serve(T &x);  
  21. private:  
  22.     void AdjustDown(int r,int j);  
  23.     void AdjustUp(int j);  
  24.     T *q;  
  25.     int n,maxSize;  
  26. };  
  27.   
  28. template <class T>  
  29. PrioQueue<T>::PrioQueue(int mSize)  
  30. {  
  31.     maxSize=mSize;  
  32.     n=0;  
  33.     q=new T[maxSize];  
  34. }  
  35.   
  36. template <class T>  
  37. void PrioQueue<T>::AdjustDown(int r,int j)  
  38. {  
  39.     int child=2*r+1;  
  40.     T tmp=q[r];  
  41.     while(child<=j)  
  42.     {  
  43.         if((child<j)&&(q[child]>q[child+1])) child++;  
  44.         if(tmp<=q[child]) break;  
  45.         q[(child-1)/2]=q[child];  
  46.         child=2*child+1;  
  47.     }  
  48.     q[(child-1)/2]=tmp;  
  49. }  
  50.   
  51. template <class T>  
  52. void PrioQueue<T>::AdjustUp(int j)  
  53. {  
  54.     int i=j;  
  55.     T tmp=q[i];  
  56.     while(i>0&&tmp<q[(i-1)/2])  
  57.     {  
  58.         q[i]=q[(i-1)/2];  
  59.         i=(i-1)/2;  
  60.     }  
  61.     q[i]=tmp;  
  62. }  
  63.   
  64. template <class T>  
  65. void PrioQueue<T>::Append(const T &x)  
  66. {  
  67.     if(IsFull())  
  68.     {  
  69.         cout<<"Overflow..."<<endl;  
  70.         exit(-1);  
  71.     }  
  72.     q[n++]=x;  
  73.     AdjustUp(n-1);  
  74. }  
  75.   
  76. template <class T>  
  77. void PrioQueue<T>::Serve(T &x)  
  78. {  
  79.     if(IsEmpty())  
  80.     {  
  81.         cout<<"Underflow..."<<endl;  
  82.         exit(-1);  
  83.     }  
  84.     x=q[0];  
  85.     q[0]=q[--n];  
  86.     AdjustDown(0,n-1);  
  87. }  

  1. //HfmTree.h  
  2. #include "BTree.h"  
  3. #include "PrioQueue.h"  
  4. template <class T>  
  5. class HfmTree:public BTree<T>  
  6. {  
  7. public:  
  8.     operator T()const  
  9.     {  
  10.         return weight;  
  11.     }  
  12.     T getW()  
  13.     {  
  14.         return weight;  
  15.     }  
  16.     void putW(const T& x)  
  17.     {  
  18.         weight=x;  
  19.     }  
  20.     void SetNull()  
  21.     {  
  22.         root=NULL;  
  23.     }  
  24. private:  
  25.     T weight;  
  26. };  
  27.   
  28. template <class T>  
  29. HfmTree<T> CreateHfmTree(T w[],char s[],int n)  
  30. {  
  31.     int i;  
  32.     PrioQueue<HfmTree<T> > pq(n);  
  33.     HfmTree<T> x,y,z,zero;  
  34.     for(i=0;i<n;i++)  
  35.     {  
  36.         z.MakeTree(w[i],s[i],x,y);  
  37.         z.putW(w[i]);  
  38.         pq.Append(z);  
  39.         z.SetNull();  
  40.     }  
  41.     for(i=1;i<n;i++)  
  42.     {  
  43.         pq.Serve(x);  
  44.         pq.Serve(y);  
  45.         z.MakeTree(w[i],'0',x,y);  
  46.         z.putW(x.getW()+y.getW());  
  47.         pq.Append(z);  
  48.         z.SetNull();  
  49.     }  
  50.     pq.Serve(z);  
  51.     return z;  
  52. }  

  1. //HfmCodemain.cpp  
  2. #include "HfmTree.h”  
  3. void Display()  
  4. {  
  5.     cout<<"XXXXXXXXXXXXXX  Huffman coding system XXXXXXXXXXXXXX"<<endl;  
  6.     cout<<"XXXXXXXXXXXXXXX      B---建树        XXXXXXXXXXXXXXX"<<endl;  
  7.     cout<<"XXXXXXXXXXXXXXX      T---遍历        XXXXXXXXXXXXXXX"<<endl;  
  8.     cout<<"XXXXXXXXXXXXXXX      E---生成代码    XXXXXXXXXXXXXXX"<<endl;  
  9.     cout<<"XXXXXXXXXXXXXXX      C---编码        XXXXXXXXXXXXXXX"<<endl;  
  10.     cout<<"XXXXXXXXXXXXXXX      D---译码        XXXXXXXXXXXXXXX"<<endl;  
  11.     cout<<"XXXXXXXXXXXXXXX      X---退出        XXXXXXXXXXXXXXX"<<endl;  
  12.     cout<<"输入选择:";  
  13. }  
  14.   
  15. void DisplayT()  
  16. {  
  17.     cout<<"     XXXXXXXXXXXXXXX 1.先序遍历 XXXXXXXXXXXXXXX     "<<endl;  
  18.     cout<<"     XXXXXXXXXXXXXXX 2.中序遍历 XXXXXXXXXXXXXXX     "<<endl;  
  19.     cout<<"     XXXXXXXXXXXXXXX 3.后序遍历 XXXXXXXXXXXXXXX     "<<endl;  
  20.     cout<<"输入选择:";  
  21. }  
  22.   
  23. int main()  
  24. {  
  25.     char flag,s[100];  
  26.     int weight[50],len,i,flagT;  
  27.     HfmTree<int> ht;  
  28.     while(1)  
  29.     {  
  30.         Display();  
  31.         cin>>flag;  
  32.         switch(flag)  
  33.         {  
  34.             case 'B':  
  35.             cout<<"输入字符集(默认没有空格):";  
  36.             cin>>s;  
  37.             len=strlen(s);  
  38.             cout<<"输入每个字符的频率:";  
  39.             for(i=0;i<len;i++)  
  40.                 cin>>weight[i];  
  41.             ht=CreateHfmTree(weight,s,len);  
  42.             ht.CreatCode();  
  43.             cout<<endl;  
  44.             break;  
  45.             case 'T':  
  46.             DisplayT();  
  47.             cin>>flagT;  
  48.             if(flagT==1)  
  49.             {  
  50.                 cout<<"先序遍历..."<<endl;  
  51.                 ht.PreOrder(Visit);  
  52.                 cout<<endl;  
  53.             }  
  54.             else if(flagT==2)  
  55.             {  
  56.                 cout<<"中序遍历..."<<endl;  
  57.                 ht.InOrder(Visit);  
  58.                 cout<<endl;  
  59.             }  
  60.             else  
  61.             {  
  62.                 cout<<"后序遍历..."<<endl;  
  63.                 ht.PostOrder(Visit);  
  64.                 cout<<endl;  
  65.             }  
  66.             break;  
  67.             case 'E':  
  68.             ht.PrintCode();  
  69.             cout<<endl;  
  70.             break;  
  71.             case 'C':  
  72.             ht.String2Code();  
  73.             break;  
  74.             case 'D':  
  75.             ht.Code2String();  
  76.             break;  
  77.             case 'X':  
  78.             cout<<"Goodbye..."<<endl;  
  79.             return 0;  
  80.             default :  
  81.             cout<<"输入错误!!!"<<endl;  
  82.             break;  
  83.         }  
  84.     }  
  85. }  


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多