关键在于最小堆与哈夫曼树的结构体定义与联系。
最小堆数组的结构体中存放频率与对应的哈夫曼树结点。
哈夫曼树的叶子结点存储字符,内结点以#存储,并且设置父指针与一个标志左或右孩子的标志,为了方便从叶结点回溯打印结果。
构造哈夫曼树之前,首先将叶结点放入堆中,初始化堆。 然后利用最小堆,每次取得两个频率最小的哈夫曼树结点,并设最小的为父亲的左孩子,次小的为父亲的右孩子,然后生成一个新的结点,其频率为两者之和,并且修改两个结点的父亲为该结点,加入到堆中,并将两个结点删除。 然后再重复寻找2个最小结点,重复这样的工作,一直运行n-1次即可全部合并完毕,这时取出堆中的最后一个结点即为哈夫曼树的根节点。
为了能够回溯打印每个叶结点的Code,我们在构造哈夫曼树之前就应该将这些哈夫曼树叶结点存放于一个数组中,在构造结束后,我们从数组中依次根据每个叶结点的parent指针与标志域就可以回溯到根节点,打印出code码。 如果我们从根节点向下递归打印code是无法打印完成的,思考一下就可以明白了。