m0_62138486 2022-11-07 18:51 采纳率: 98.6%
浏览 251
已结题

构造哈夫曼树以及计算带权路径长度

7-1 哈夫曼树
分数 15
作者 李廷元
单位 中国民用航空飞行学院
哈夫曼树,第一行输入一个数n,表示叶结点的个数。

需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出哈夫曼树的带权路径长度(WPL)。

输入格式:
第一行输入一个数n,第二行输入n个叶结点(叶结点权值不超过1000,2<=n<=1000)。

输出格式:
在一行中输出WPL值。

输入样例:
5
1 2 2 5 9
输出样例:
37

我的问题:
我们老师上课讲解过如何构造哈夫曼树这是方法:
结点结构如下。

define MAXBIT 10
define MAXVALUE 1000
typedef struct HNode /定义结点结构/
{ int weight;
int parent , lchild , rchild;
}HNode, *HTree;

HTree HuffmanTree( int w , int n) /给定n个权值构造哈夫曼树/
{ / w存储n个字符的权值,构造哈夫曼树HT*/
int m, m1, m2, x1, x2, i, j; HTree ht;
HNode *p;
if (n <= 1) return NULL;
m= 2*n-1;
ht = (HNode *)malloc (m*sizeof(HNode) ); /*哈夫曼树的构造*/
if(ht==NULL) return ht;
for(p = ht, i =0; i < n; ++ i, ++ p, ++w) /*初始化叶子结点信息*/
{ p->weight = *w; p->lchild = -1;
p->rchild = -1; p->parent = -1;
}
for( ; i < m; ++ i, ++ p) /*初始化分支结点信息*/
{ p->weight = 0; p->lchild = -1;
p->rchild = -1; p->parent = -1;
}
for( i = n; i < m; ++ i) /*构造哈夫曼树 */
{ m1 = m2 = MAXVALUE;
x1 = x2 = 0; /寻找parent为-1且权值最小的两棵子树/
for(j = 0; j < i; ++ j)
{ if( ht[j].parent == -1 && ht[j].weight < m1)
{ m2 = m1; x2 = x1; m1 = ht[j].weight; x1 = j; }
else if( ht[j].parent == -1 && ht[j].weight < m2)
{ m2 = ht[j].weight; x2 = j; }
}
/合并成一棵新的子树/
ht[x1].parent = i; ht[x2].parent = i;
ht[i].lchild = x1; ht[i].rchild = x2;
ht[i].weight = m1 + m2;
}
return ht;
}
说实话看的有的云里雾里的能不能用中文描述下思路
而且题中要让求最短路径长度,我这上面只有构造哈夫曼树这一块,求解最短路径长度这块有点不知道如何下手,还有主函数也不太知道咋写,希望能同时提供解题思路以及完整运行结果,感谢感谢,因为基础太差了,我就算知道思路自己也打不出来,答案错误看半天也找不出错误,辛苦

  • 写回答

2条回答 默认 最新

查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月18日
  • 已采纳回答 11月10日
  • 创建了问题 11月7日

悬赏问题

  • ¥15 人大金仓下载,有人知道怎么解决吗
  • ¥15 一个小问题,本人刚入门,哪位可以help
  • ¥15 python安卓开发
  • ¥15 使用R语言GD包一直不出结果
  • ¥15 计算机微处理器与接口技术相关问题,求解答图片的这个问题,有多少个端口,端口地址和解答问题的方法和思路,不要AI作答
  • ¥15 如何根据一个截图编写对应的HTML代码
  • ¥15 stm32标准库的PID角度环
  • ¥15 ADS已经下载好了,但是DAS下载不了,一直显示这两种情况,有什么办法吗,非常急!
  • ¥100 Excel 点击发送自动跳转outlook邮件
  • ¥15 gis中用栅格计算器或加权总和后图层不显示,值也明显不对