树--利用最小堆建立哈夫曼树

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);
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值