学号 20182315 《数据结构与面向对象程序设计》实验构建哈夫曼树报告
课程:《程序设计与数据结构》
班级: 1823
姓名: 邹家伟
学号:20182315
实验教师:王志强
实验日期:2019年11月15日
必修/选修: 必修
1.实验内容
(1)准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率
(2)构造哈夫曼树
(3)对英文文件进行编码,输出一个编码后的文件
(4)对编码文件进行解码,输出一个解码后的文件
2. 实验过程及结果
该实验可以粗略分为以下几个步骤:
- (1)文件读取:将文件中的字符读到Java代码里去,将编完码的数据存到文件中,再将解码文件存入文件。
这部分难度不大,有之前的基础,实现起来很容易。
- (2)计算每个字符出现的频数:这部分难度也不大,使用二重循环,把握好循环跳出的条件即可。
(3)根据频数构造哈夫曼二叉树:这部分难度最大,困惑我时间最长。
起初我想用数组来构建二叉树,可是我发现无法区分存取取出节点,从而无法确定哪个结点为字母的频数。
后来我思考到用两个不一样的数组存放字母频数与取出的频数,再将其放入到第三个数组进行排序,但这样进行太过复杂,尤其在后期编码解码过程中,程序尤为复杂,得不偿失。
最后,通过网络搜索,我发现可以哈夫曼树的创建也可使用创建树的基本方法创建,即写出一个节点类,在节点类里存放字符信息,如果为两个字符频数之和,即字符信息为空。
(4)编码和解码:此步骤与之前遍历类似,都为先左后右,定义一个编码字符串,如果向左移,编码字符串 +“1”,如向右,编码字符串 +“0”;
感悟
完成哈夫曼树的构造,让我明白一个道理,凡是树的构造,都应首先考虑使用结点,因为结点里可以存放树的很多信息,这意味着树可以有很多种用法。实现树的方法可以能有很多种,但我们还是最应该考虑哪种方法对最后的遍历最有效。
参考资料
- 哈夫曼树的构建