哈夫曼树的构造:
从给定的n个数中,选两次最小值,将这两个数的和作为结点的权值,并将这两个数分别置为结点的左右孩子,该结点置为两个数的父亲结点.并将该结点放入所给的n个数中,重复该过程n-1次。
#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);
}
}