**(题目源于PTA)**构造哈夫曼树,计算WPL。
函数接口定义:
void CreateHTree()
void CreateHCode()
输入样例:第一行输入一个数n(1<n<100),表示叶子节点的个数,接下去输入n行,每行输入一个字符和一个整数,表示每个节点表示的字符和权值。
5
A 8
B 10
C 2
D 11
E 1
输出样例:输出WPL。
WPL=67
void CreateHTree()
{
NodeType e,e1,e2;
priority_queue<NodeType>qu;
for (int k=0;k<2*n-1;k++)
ht[k].lchild=ht[k].rchild=ht[k].parent=-1;
for(int i=0;i<n;i++)
{
e.no=i;
e.data=ht[i].data;
e.weight=ht[i].weight;
qu.push(e);
}
for(int j=n;j<2*n-1;j++)
{
e1=qu.top();
qu.pop();
e2=qu.top();
qu.pop();
ht[j].weight=e1.weight+e2.weight;
ht[j].lchild=e1.no;
ht[j].rchild=e2.no;
ht[e1.no].parent=j;
ht[e2.no].parent=j;
e.no=j;
e.weight=e1.weight+e2.weight;
qu.push(e);
}
}
void CreateHCode()
{
string code;
code.reserve(MAX);
for(int i=0;i<n;i++)
{
code="";
int curno=i;
int f=ht[curno].parent;
while(f!=-1)
{
if (ht[f].lchild==curno)
code='0'+code;
else
code='1'+code;
curno=f;
f=ht[curno].parent;
}
htcode[ht[i].data]=code;
}
}
裁判测试程序样例:
#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <map>
using namespace std;
#define MAX 101
int n;
struct HTreeNode //哈夫曼树结点类型
{
char data; //字符
int weight; //权值
int parent; //双亲的位置
int lchild; //左孩子的位置
int rchild; //右孩子的位置
};
HTreeNode ht[MAX]; //哈夫曼树
map<char,string> htcode; //哈夫曼编码
struct NodeType //优先队列结点类型
{
int no; //对应哈夫曼树ht中的位置
char data; //字符
int weight; //权值
bool operator<(const NodeType &s) const
{ //用于创建小根堆
return s.weight<weight;
}
};
void CreateHTree();
void CreateHCode();
int WPL() //求WPL
{
int wps=0;
for (int i=0;i<n;i++)
wps+=ht[i].weight*htcode[ht[i].data].size();
return wps;
}
int main()
{
cin >> n;
for(int i=0;i<n;i++)
{
cin >> ht[i].data >> ht[i].weight;
}
CreateHTree(); //建立哈夫曼树
CreateHCode(); //求哈夫曼编码
printf("WPL=%d",WPL());
return 0;
}
/* 请在这里填写答案 */