(第16题)构造哈夫曼树(难度系数85)

题目描述1321:

构造哈夫曼树
题目描述:
根据给定的叶结点字符及其对应的权值创建哈夫曼树。
输入:
第一行为叶子结点的数目n(1<=n<=100)。第二行为一个字符串,包含n个字符,每个字符对应一个叶子结点,第三行为每个叶子结点的概率(即权值),要求根据各叶结点构造哈夫曼树。构造哈夫曼树的原则是先两个最小的,构造一个父结点,其中最小的结点为左孩子,次小的为右孩子,如果两个最小的叶结点相等,则取排在前一个位置的为左孩子。
输出:
哈夫曼树的权值,左孩子,右孩子及其对应的父亲,相邻数据之间用空格隔开;
输入样例:
5
abcde
15 25 15 20 25
输出样例:
15 0 0 6
25 0 0 7
15 0 0 6
20 0 0 7
25 0 0 8
30 1 3 8
45 4 2 9
55 5 6 9
100 7 8 0

#include

using namespace std;

const int N = 1010;

int w[N];
int l[N],r[N],fa[N];
int a[N],cnt;
int idx = 1;//编号 

bool cmp(int x, int y)
{
	//从大到小排序 
	if(w[x] != w[y]) return w[x] > w[y];//先按权重排序 
	return x > y;//权重相同按编号排 
}

int main()
{
	int n;
	cin>>n;
	string s;
	cin>>s;
	
	for(int i=1;i<=n;i++)
	{
		cin>>w[i];
		idx++;
		a[cnt++] = i;
	}
	
	while(cnt > 1)
	{
		sort(a, a+cnt, cmp);
		
		int num1 = a[cnt-1];//新节点左孩子 
		int num2 = a[cnt-2];//新节点右孩子 
		
		a[cnt-2] = idx++; //新节点编号入a 
		w[a[cnt-2]] = w[num1] + w[num2];//新节点权值 
		
		l[a[cnt-2]] = num1;
		r[a[cnt-2]] = num2;
		fa[num1] = a[cnt-2];
		fa[num2] = a[cnt-2];
		
		cnt--;
	}
	
	for(int i=1;i

你可能感兴趣的:(算法,c++,数据结构)