北邮数据结构实验报告 联系客服

发布时间 : 星期五 文章北邮数据结构实验报告更新完毕开始阅读897193b19a89680203d8ce2f0066f5335b81676f

cout parent=root.lchild; else //编码为1则寻找右孩子 parent=root.rchild; i++; }

if(tSize==1) //如果编码表只有一个字符,则根结点即为叶子结点 i++;

(1,HCodeTable.data);//将叶子节点对应的字符追加到解码串中 } cout } 时间复杂度:

设待解码串长度为n,则复杂度为O(n)

8. 计算哈夫曼编码的压缩比(void

HuffmanTree::Calculate(string s1,string s2)) 算法伪代码:

1. 获得编码前字符串的长度,即其占用的字节数 2. 获得编码后的字符串的长度,将其除以8然后向上取整,得到其占用的字 节数

3. 压缩比将两个相除 源代码:

void HuffmanTree::Calculate(string s1,string s2)

{

int cal1=(); int cal2=();

cal2=ceill((float)cal2/8); //将编码串的比特数转化为字节数 cout cout cout } 时间复杂度: O(1)

9. 打印哈夫曼树(void HuffmanTree::PrintTree(int TreeNode,int layer) ) 算法伪代码: 1. 如果待打印结点为空,则返回 2. 递归调用函数打印当前结点的右子树

3. 根据当前结点所在的层次确定其前面要输出多少空格,先输出空格,在打 印当前结点的权值

4. 递归调用函数打印当前结点的左子树 源代码:

void HuffmanTree::PrintTree(int TreeNode,int layer) {

if(TreeNode==-1) //如果待打印结点为空,则返回 return; else

{

PrintTree(root.rchild,layer+1); //先打印该结点的右子树,layer记录 的是该结点所在的层次 for(int i=0;i 空格

cout cout PrintTree(root.lchild,layer+1); //打印该结点的左子树 } }

时间复杂度:

中序遍历哈夫曼树,复杂度为O(n) 10. 菜单函数(void HuffmanTree::Menu()) 算法伪代码:

1. 逐一读取键盘缓存区中的字符,并将它们逐一追加到记录输入字符串的

string变量中,直到读到回车输入符为止 2. 删除string变量末尾的回车输入符

3.利用string变量创建哈夫曼树,初始化编码表。 4. 直观打印哈夫曼树 5. 对输入的字符串进行编码 6. 对编码后的字符串进行解码

7. 计算编码前后的压缩比并输出 源代码:

void HuffmanTree::Menu() {

cout string Input; char letter;

do //将字符逐个读入Input变量中 {

letter=(); (1,letter);

}while(letter!=' ');

(()-1,1); //去掉Input末尾的回车符

Init(Input); //根据输入的字符串创建哈夫曼树及其编码表 cout PrintTree(2*tSize-1-1,1); //打印哈夫曼树

cout string d1,d2;

cout Encode(Input,d1); //编码并打印编码串 cout Decode(d1,d2); //解码并打印解码串 cout Calculate(Input,d1); //计算编码前后的压缩比 } 其他

1.由于题目要求能输入任意长的字符串,所以本程序采用了string变量来记录输入

的字符串,并采用string类的类成员函数来完成各项任务

2.打印哈夫曼树时采用了递归函数,且采用了凹凸表的形式打印哈夫曼树。

3.为了输入空格,输入时采取逐个字符输入的方式 3. 程序运行结果 主函数流程图: 运行结果:

各函数运行正常,没有出现bug 4. 总结

经过这次实验,我了解了哈夫曼树的创建过程,了解了一种不等长编码的方法,用设断点调试的方法更加熟练,同时熟悉了STL中string类型的用法,对C++更加熟悉