哈夫曼树
8
4 5 1 2 1 3 1 1
#include<bits/stdc++.h>
using namespace std;
typedef struct tree{
	int data;
	struct tree* Lchild;
	struct tree* Rchild;
}Tree,*Huffman;
Huffman createTree(int arr[],int max)
{
	Huffman parr[max];
	Huffman p,root=NULL;
	for(int i=0;i<max;i++)
	{
		p=(Huffman)malloc(sizeof(Tree));
		p->data=arr[i];
		p->Lchild=p->Rchild=NULL;
		parr[i]=p;
	}
	for(int i=1;i<max;i++)
	{
		//进行n-1次循环建立哈夫曼树
		//k1表示森林中具有最小权值的根节点的下标,k2为次最小的下标
		int k1=-1,k2;
		for(int j=0;j<max;j++)
		{
			if(parr[j]!=NULL&&k1==-1)
			{
				k1=j;
				continue;
			}
			if(parr[j]!=NULL)
			{
				k2=j;
				break;
			}
		 }
		 //将指针数组中的指针指向的最小值赋值给索引号为k1的,次小值赋值给索引号为k2的
		 for(int j=k2;j<max;j++)
		 {
		 	if(parr[j]!=NULL)
		 	{
		 		if(parr[j]->data<parr[k1]->data)
		 		{
		 			k2=k1;
		 			k1=j;
				 }else if(parr[j]->data<parr[k2]->data)
				 {
				 	k2=j;
				 }
			 }
		  } 
		  //由最小权树和次最小权值树建立一颗新树,root指向树根结点
		  root=(Huffman)malloc(sizeof(Tree));
		  root->data=parr[k1]->data+parr[k2]->data;
		  root->Lchild=parr[k1];
		  root->Rchild=parr[k2];
		  parr[k1]=root;//将指向新树的指针赋给parr指针数组中k1位置
		  parr[k2]=NULL;//k2位置为空 
	}
	return root; 
}
//计算权值 
int  WeightLength(Huffman Tree,int len)
{
	if(Tree==NULL)
	return 0;
	else
	{
		if(Tree->Lchild==NULL&&Tree->Rchild==NULL){
			return Tree->data*len;//访问到叶节点 
		}else{
			return WeightLength(Tree->Lchild,len+1)+WeightLength(Tree->Rchild,len+1);
		}
	}
}
int main()
{ 
	int Arr[10000];
	int max;
	cin>>max;
	for(int i=0;i<max;i++)
	{
	   scanf("%d",&Arr[i]);
	}
	Huffman root=createTree(Arr,max);//返回指向哈夫曼数根节点的指针;
	cout<<WeightLength(root,0)<<endl; 
	return 0;
}
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号