哈夫曼树的构造

学号 20182315 《数据结构与面向对象程序设计》实验构建哈夫曼树报告

课程:《程序设计与数据结构》

班级: 1823

姓名: 邹家伟

学号:20182315

实验教师:王志强

实验日期:2019年11月15日

必修/选修: 必修

1.实验内容

(1)准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率

(2)构造哈夫曼树

(3)对英文文件进行编码,输出一个编码后的文件

(4)对编码文件进行解码,输出一个解码后的文件

2. 实验过程及结果

该实验可以粗略分为以下几个步骤:

  • (1)文件读取:将文件中的字符读到Java代码里去,将编完码的数据存到文件中,再将解码文件存入文件。
    这部分难度不大,有之前的基础,实现起来很容易。

哈夫曼树的构造_第1张图片

  • (2)计算每个字符出现的频数:这部分难度也不大,使用二重循环,把握好循环跳出的条件即可。

哈夫曼树的构造_第2张图片

  • (3)根据频数构造哈夫曼二叉树:这部分难度最大,困惑我时间最长。

    起初我想用数组来构建二叉树,可是我发现无法区分存取取出节点,从而无法确定哪个结点为字母的频数。

    后来我思考到用两个不一样的数组存放字母频数与取出的频数,再将其放入到第三个数组进行排序,但这样进行太过复杂,尤其在后期编码解码过程中,程序尤为复杂,得不偿失。

    最后,通过网络搜索,我发现可以哈夫曼树的创建也可使用创建树的基本方法创建,即写出一个节点类,在节点类里存放字符信息,如果为两个字符频数之和,即字符信息为空。
    哈夫曼树的构造_第3张图片

  • (4)编码和解码:此步骤与之前遍历类似,都为先左后右,定义一个编码字符串,如果向左移,编码字符串 +“1”,如向右,编码字符串 +“0”;

    感悟

完成哈夫曼树的构造,让我明白一个道理,凡是树的构造,都应首先考虑使用结点,因为结点里可以存放树的很多信息,这意味着树可以有很多种用法。实现树的方法可以能有很多种,但我们还是最应该考虑哪种方法对最后的遍历最有效。

参考资料

-  文件读取的相关知识

-  哈夫曼树的构建

你可能感兴趣的:(哈夫曼树的构造)