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;
}
标签:哈夫曼,int,Tree,k2,k1,parr,NULL From: https://www.cnblogs.com/djcf/p/17830411.html