哈夫曼树的构造:
从给定的n个数中,选两次最小值,将这两个数的和作为结点的权值,并将这两个数分别置为结点的左右孩子,该结点置为两个数的父亲结点.并将该结点放入所给的n个数中,重复该过程n-1次。
利用堆构建哈夫曼树:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 10003
typedef struct Node{
int data[MAX];
int size;
}Node,*PNode;
void Push(Node &q,int x){
int i=++q.size;
for(;i>1&&q.data[i/2]>x;i/=2)
q.data[i]=q.data[i/2];
q.data[i]=x;
}
int Pop(Node &q){
int x=q.data[1];
int tail=q.data[q.size--];
int parent=1,child;
for(;parent*2<=q.size;parent=child){
child=parent*2;
if(child<q.size&&q.data[child]>q.data[child+1])
++child;
if(tail<=q.data[child]) break;
q.data[parent]=q.data[child];
}
q.data[parent]=tail;
return x;
}
void Show(Node q){
for(int i=1;i<=q.size;i++)
printf("%d ",q.data[i]);
printf("\n");
}
int main(){
int n,i,x;
scanf("%d",&n);
Node q; q.size=0;
for(i=0;i<n;i++){
scanf("%d",&x);
Push(q,x);
}
int sum=0;
while(q.size>1){
int a=Pop(q);
int b=Pop(q);
Push(q,a+b);
}
printf("%d",sum);
}
#include <iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
typedef struct HuffmanTree{
int weight;
int parent,leftchild,rightchild;
}HuffmanTree,*PHuffmanTree;
void Select(PHuffmanTree &ph,int s,int &s1,int &s2){
s1=-1;
for(int i=1;i<=s;i++){
if(!ph[i].parent&&s1==-1){
s1=i;
continue;
}
else if(!ph[i].parent&&s1!=-1){
s2=i;
break;
}
}
for(int i=s2;i<=s;i++){
if(!ph[i].parent){
if(ph[i].weight<ph[s1].weight){
s2=s1;
s1=i;
}
else if(ph[i].weight<ph[s2].weight)
s2=i;
}
}
}
void CreateHuffmanTree(PHuffmanTree &ph,int n){
int s1,s2,x,j=0;
ph=new HuffmanTree[n+1];
for(int i=1;i<=2*n-1;i++){
ph[i].parent=0;
ph[i].leftchild=0;
ph[i].rightchild=0;
}
for(int i=1;i<=8;i++)
scanf("%d",&ph[i].weight);
cout<<endl;
for(int i=n+1;i<=2*n-1;i++){
Select(ph,i-1,s1,s2);
ph[s1].parent=i; ph[s2].parent=i;
ph[i].leftchild=s1; ph[i].rightchild=s2;
ph[i].weight=ph[s1].weight+ph[s2].weight;
}
}
void ShowHuffmanTree(PHuffmanTree ph,int n){
for(int i=1;i<=2*n-1;i++){
cout<<ph[i].weight<<" parent:"<<ph[i].parent<<" leftchild:"<<ph[i].leftchild;
cout<<" rightchild:"<<ph[i].rightchild<<endl;
}
}
int main(){
int n;
while(cin>>n){
PHuffmanTree ph;
CreateHuffmanTree(ph,n);
ShowHuffmanTree(ph,n);
}
}