知识前提:
一棵树的路径长度为从树根到其余各节点的路径长度之和
结点的带权路径长度为从根结点到该结点之间的路径长度与该结点上所带权值的乘积
每个叶结点的带权路径长度之和就是这棵树的带权路径长度
哈夫曼树定义:
假设有n个权值,构造有n个叶子的二叉树,每个叶子的权值就是n个权值之一,这样可以构造很多个,其中一个是带权路径长度最小的,这棵二叉树就被称为哈夫曼树或最优二叉树
哈夫曼树的构造,用到最小堆:
必须使权值越大的叶结点越靠近根节点,提出一种贪心算法,在初始状态下,将每个元素看作一棵独立的树,每次选择权值最小的两棵树进行合并
对于同一组给定权值叶结点所构造的哈夫曼树,树的形状可能不同。但无论形状如何,这些哈夫曼树的带权路径长度是相同的,并且一定都是同一最小值
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
struct node{
int weight;
struct node *left;
struct node *right;
};
void PercolateDown(struct node *minHeap[],int loc,int *n){
int i,child;
struct node *temp=minHeap[loc];
for(i=loc;i*2<=*n;i=child){
child=i*2;
if(child+1<=*n&&minHeap[child+1]->weight<minHeap[child]->weight)
child++;
if(temp->weight>minHeap[child]->weight)
minHeap[i]=minHeap