每次寻找最小的且之前没有作为子节点的两个节点作为子节点生成新的双亲结点,依次进行,直到只剩一个节点(该节点相当于根节点)。对于获取哈夫曼编码,就从叶子节点开始,依次遍历其双亲结点,每次判断之前的子节点是左还是右并进行对应标记,记录下来所有叶子节点的编码,即可得所有字符的编码,从而可以求出字符串的编码。具体结合代码理解。
#include
#include
#include
#define MAXSIZE 10000
#define MAXNUM 999999
typedef struct {
int weight;
int parent;
int LChild;
int RChild;
}HuffmanTree;
HuffmanTree huffman[MAXSIZE];
char str[MAXSIZE];
int w[MAXSIZE];
char strHuff[200][MAXSIZE];
void Select(HuffmanTree* ht, int n, int* s1, int* s2); // 搜索节点
void CrtHuffmanTree(HuffmanTree* ht, int w[], int n); // 创建哈夫曼树
void CrtHuffmanCode(HuffmanTree* ht, int n, char str[]); // 哈夫曼编码
void printHuffmanTree(HuffmanTree* ht, int n); // 打印哈夫曼树
int main()
{
int n;
printf("请输入字符个数:");
scanf("%d",&n);
getchar();
printf("请输入这些字符:");
for(int i=0;i