1定义
构建
1每次把权值最小的两颗二叉树合并,最后即可构建哈夫曼树
2可以利用最小堆来实现,只不过现在存放的是根节点,不是普通的int,char类型的数据
#include<bits/stdc++.h>
using namespace std;
struct Haff{
int data;
Haff *left;
Haff *right;
};
typedef Haff * haff;
struct node{
haff * data;
int size;
};
typedef node* tree;
tree create1(){
tree t=new node;
t->data=(haff*)malloc(sizeof(node)*10);
t->size=0;
haff f=new Haff;
f->left=NULL;
f->right=NULL;
f->data=-10000;
t->data[0]=f;
return t;
}
haff create2(){
haff f=new Haff;
f->left=NULL;
f->right=NULL;
return f;
}
void sort1(tree H,int i){
int parent,child;
int tmp = H->data[i]->data;
haff f=H->data[i]; // 取出当前"根结点"值
for(parent=i;parent*2<=H->size;parent = child){
child = 2 * parent;
if((child!=H->size) && (H->data[child+1]->data < H->data[child]->data))
child++;
if(H->data[child]->data >= tmp)
break;
else
H->data[parent] = H->data[child];
}
H->data[parent]= f;//一定要这样换,不能用值得方式换
}
void adjust(tree t){
for(int i=t->size/2;i>0;i--)sort1(t,i);
}
void buildMinHeap(tree t){
t->size=0;
haff f;
for(int i=1;i<=5;i++){
int n;
cin>>n;
f=new Haff;
f->left=NULL;
f->right=NULL;
f->data=n;
t->data[++t->size]=f;
}
adjust(t);
}
void preOrder(tree t){
for(int i=1;i<=t->size;i++){
cout<<t->data[i]->data<<" ";
}
cout<<endl;
}
haff Delete(tree t){
haff f=t->data[1];
haff temp=t->data[t->size--];
int p,c;
int size=t->size;
for(p=1;p*2<=size;p=c){
c=p*2;
if(c!=size){
if(t->data[c]->data >t->data[c+1]->data)c++;
}
if(t->data[c]->data >=temp->data)break;
else t->data[p]=t->data[c];
}
t->data[p]=temp;
return f;
}
void insert(tree t,haff f){
int size=++t->size;
int i=size;
int w=f->data;
for( ;t->data[i/2]->data >w;i/=2){
t->data[i]=t->data[i/2];
}
t->data[i]=f;
}
haff union1(tree t){
int size=t->size;
haff f;
for(int i=0;i<size-1;i++){
//进行n-1此的合并
f=new Haff;
f->left=Delete(t);
f->right=Delete(t);
f->data=f->left->data+f->right->data;
insert(t,f);
}
f=Delete(t);
return f;
}
void pre(haff f){
if(!f)return;
cout<<f->data<<" ";
pre(f->left);
pre(f->right);
}
int main(){
tree t=create1();
buildMinHeap(t);
haff f=union1(t);
pre(f);
}