哈夫曼树建立算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_39993896/article/details/84484605