哈夫曼树:
所谓哈夫曼(Huffman)树就是最优二叉树,是带权路径长度WPL最小的二叉树。
哈夫曼树的构造:
根据哈夫曼树的特点:权值越大的结点离根结点越近。
具体方法:依次选择权值最小的二个结点作为左右子树构造一颗新的二叉树,其产生的根结点的权值为左右子树权值之和。一直重复直到只含一棵树为止。‘
权值:
哈夫曼树:
哈夫曼树的存储:
由于哈夫曼树中没有度为1 的结点,则一棵有n个叶子结点的哈夫曼树共有 2n-1个结点,可以存储在一个大小为2n-1的一维数组中。
为了实现方便,数组的0号单元不使用,从1号单元开始使用,所以数组的大小为2n,。将叶子结点集中存储在前面部分 1~n个位置。
代码如下:
#include<stdio.h>
#include<iostream>
//哈夫曼树定义
typedef struct {
int weight;
int parent, lchild, rchild;
}HTNode, *HuffmanTree;
//选择两个双亲域为0且权值最小的结点,并返回在HT中的序号s1,s2
void Select(HuffmanTree &HT, int n, int &s1, int &s2)
{
//寻找第一个双亲域为0且权值最小的结点
int min;
for (int i = 1; i <= n; i++) //找到第一个双亲域为0的,下标暂存到min
{
if (HT[i].parent == 0)
{
min = i;
break;
}
}
for (int i = 1; i <= n; i