【问题描述】
已知输入一串正整数,正整数之间用空格键分开,请建立一个哈夫曼树,以输入的数字为叶节点,求这棵哈夫曼树的带权路径长度。
【输入形式】
首先输入正整数的个数,然后接下来为接下来的正整数,正整数个数不超过10个
【输出形式】
输出相应的权值
【样例输入】
5 4 5 6 7 8
【样例输出】
69
#include <stdio.h>
#include <stdlib.h>
/**
*@ziyif
*/
typedef int QElemType;
typedef struct Qnode{
QElemType data;
struct Qnode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
void InitQueue(LinkQueue *Q);
void EnQueue(LinkQueue *Q,QElemType e);
QElemType DeQueue(LinkQueue *Q);
int GetLength(LinkQueue *Q);
int main()
{
LinkQueue Q;
InitQueue(&Q);
int N;
scanf("%d",&N);
int a[N];
int length;
int i,j,k;
int temp;
for(i=0;i<N;i++){
scanf("%d",&a[i]);
}
//sort
for(i=0;i<N-1;i++){
k=i;
for(j=i+1;j<N;j++){
if(a[j]<a[k]){
k=j;
}
}
if(k!=i){
temp=a[k];
a[k]=a[i];
a[i]=temp;
}
}
//push Queue
for(i=0;i<N;i++){
EnQueue(&Q,a[i]);
}
length=GetLength(&Q);
int sum=0;
int num=0;
while(length>1){
int a,b;
a=DeQueue(&Q);
//printf("a=%d\n",a);
length=GetLength(&Q);
//printf("%d\n",length);
b=DeQueue(&Q);
//printf("b=%d\n",b);
length=GetLength(&Q);
//printf("%d\n",length);
num=a+b;
sum+=num;
//printf("sum=%d\n",sum);
//printf("num=%d\n",num);
EnQueue(&Q,num);
length=GetLength(&Q);
}
printf("%d",sum);
return 0;
}
void InitQueue(LinkQueue *Q){
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q->front){
printf("OVERFLOW");
exit(0);
}
Q->front->next=NULL;
}
void EnQueue(LinkQueue *Q,QElemType e){
QNode *p=(QueuePtr)malloc(sizeof(QNode));
if(!p){
printf("OVERFLOW");
exit(0);
}
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
QElemType DeQueue(LinkQueue *Q){
if(Q->front==Q->rear){
printf("ERROR");
exit(0);
}
QElemType e;
QNode *p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p){
Q->rear=Q->front;
}
free(p);
return e;
}
int GetLength(LinkQueue *Q){
int length=0;
QNode *p;
p=Q->front;
while(p->next){
p=p->next;
length++;
}
return length;
}