版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39993896/article/details/84484605
哈夫曼树的建立
Problem Description
由若干个值无重复的结点及其权值,建立相应的哈夫曼树。在合并过程中,若出现权值相同的情况,则优先选取编号小的进行合并;要求哈夫曼树中所有左孩子编号小于右孩子编号(以结点的输入顺序做为其编号)。
Input
有多组测试数据,每组数据由结点信息组成。结点信息部分的第一行为一个整数n(n<=20),表示以下有n个结点信息,每个结点信息包括一个字符和一个整数,表示结点值和权值。
Output
输出存储哈夫曼树的数组,每个结点信息占一行,每组输出结果后均有一空行。
Sample Input
4 A7 G5 O2 D4
Sample Output
7,6,-1,-1 5,5,-1,-1 2,4,-1,-1 4,4,-1,-1 6,5,2,3 11,6,1,4 18,-1,0,5
#include <iostream>
#include<stdio.h>
using namespace std;
struct node {
int parent;
int lchild,rchild;
int weight;
};
node* array;
int select_min(int n) {
int minIndex;
for(int i=0;i<2*n-1;i++){
if(array[i].parent==-1&&array[i].weight!=0) {
minIndex=i;break;
}
}
for(int i=0; i<2*n-1; i++) {
if(array[i].parent==-1&&array[i].weight!=0) {
if(array[i].weight<array[minIndex].weight)
minIndex=i;
}
}
array[minIndex].parent=1;
return minIndex;
}
void CreatHuffman(int *w,int n) {
for(int i=0; i<2*n-1; i++) {
array[i].parent=-1;
array[i].lchild=-1;
array[i].rchild=-1;
array[i].weight=w[i];
}
for(int j=n; j<2*n-1; j++) {
int min_lchild=select_min(n);
int min_rchild=select_min(n);
array[j].lchild=min_lchild;
array[j].rchild=min_rchild;
array[j].weight=array[min_lchild].weight+array[min_rchild].weight;
array[min_lchild].parent=j;
array[min_rchild].parent=j;
}
}
void showData(int n) {
for(int i=0; i<2*n-1; i++) {
cout<<array[i].weight<<","<<array[i].parent<<","<<array[i].lchild<<","<<array[i].rchild<<endl;
}
}
int main() {
int n;
while(cin>>n) {
array=new node[2*n-1];
int *w=new int[2*n-1];
for(int i=0; i<n; i++) {
char ch;
cin>>ch>>w[i];
}
for(int i=n; i<2*n-1; i++)
w[i]=0;
CreatHuffman(w,n);
showData(n);
cout<<endl;
}
return 0;
}