树之哈夫曼树(最优二叉树)

        本文来介绍哈夫曼树。哈夫曼树又叫最优二叉树,是一种特殊的二叉树。这种二叉树最重要的特征就是:树的带权路径长度(Weighted Path Length of Tree,简记为WPL)最小。本文给出了哈弗曼算法的实现过程,代码部分已经描述的比较详细,这里就不再叙述了。

        需要说明的是哈夫曼树的构造并不唯一,因为其左右子树位置交换,并不影响该二叉树的带权路径长度最小的性质。哈夫曼树有许多应用,比如说哈夫曼编码等等,哈夫曼编码将在我的下一篇博文中作简要介绍。

#include
#include
#include
using namespace std;

#define n 5           //叶子数目
#define m 2*n-1       //树中结点总数
typedef struct{       //结点类型
    double weight;    //结点的权值
    int parent,lchild,rchild;//双亲指针及左右孩子
}HTNode;
typedef HTNode HuffmanTree[m];//HuffmanTree是向量类型

typedef struct{       //用于SelectMin函数中排序的结点类型
    int id;           //保存根结点在向量中的序号
    double weight;    //保存根结点的权值
}temp;

void InitHuffmanTree(HuffmanTree T){
    //初始化哈夫曼树
    //将2n-1个结点里的三个指针均置为空(即置为-1),权值置为0
    for(int i=0;i

测试样例以及预测运行结果:

树之哈夫曼树(最优二叉树)_第1张图片

树之哈夫曼树(最优二叉树)_第2张图片

运行结果:

树之哈夫曼树(最优二叉树)_第3张图片


你可能感兴趣的:(数据结构)