很早之前写的代码,今天翻出了整理了半天才找着个行的通的版本,发帖当作笔记了。
备注:只能完成26个小写字母的编码,并分别输出;在选取weight值最小的两个结点方法中还可引入算法优化;内存控制有待加强。
本代码中大量采用指针操作,
基本思路:1,统计字符串中各个小写字母出现的频数,并构造相关节点,每一个节点相当于MHTree的一颗子树;
2,选取各个子树中最小weight值得两棵子树,假设指针数组下标分别为max_index,min_index。并以他们的weigh之和(即频数之 和)构造MHTree中新的内结点,具体data以及capacity的设定是为了便于后续输出相应字符的哈夫曼编码;
3,使max_index对应的指针指向新生成的内结点,min_index.....指向NULL;
4,循环1.2.3。最终得到MHTree的根节点;
5,按照一定规则遍历,则可输出各个字符对应的哈夫曼编码。
验证过10组数据,通过。
源码如下:
#include<iostream>
#include<cassert>
#include<string>
using namespace std;
#define MAXSIZE 26
typedef struct Node
{
ch