目录
所以说,除了算法复杂度的问题之外,不用他这里赋初值的方式而是像我一样直接放第一个值是否可行???
前置条件:(哈夫曼树结构构造)
#include<iostream>
using namespace std;
struct HTNode
{
int weight;
int parent;
int lchild, rchild;
};
typedef HTNode* HuffmanTree;
HuffmanTree HT;//既表示指针又表示整个数组
typedef int Status;
哈夫曼树构造(创建)过程:
基本核心流程(原理):
1、构造森林全是根;
2、选用两小造新树;
3、删除两小添新人;
4、重复 2、3 剩单根
Part 1:
void CreateHuffmanTree(HuffmanTree& H, int n) //已知输入有n个结点
{
//1、构造森林全是根
int m = 2 * n - 1;
//数组共2n-1个有效元素
H = new HTNode[m + 1];
//第0位空置
for (int i = 1; i <= m ; i++)
H[i].lchild = H[i].parent = H[i].rchild = 0;
for (int i = 1; i <= n; i++)
cin >> H[i].weight;
这里中间犯过的错误我就不一一赘述了,只拿出其中几个踩过的坑来说一下:
(1):2n和2 * n 完全不一样
该问题来源自: int m = 2 * n - 1;
猜测:(不过应该也是对的)
2n应该表示一个单独的(定义)变量
2 * n应该才是表示两倍的 n 相乘的结果
(2):这里连续赋值的语句影响程序的最终结果吗
应该不影响,程序执行的操作也就只是从右往左一个一个赋值而已,这里并不影响操作结果:

Part 2:
第一版:
// 2、选用两小造新树;
// 3、删除两小添新人;
// 4、重复 2、3 剩单根
int s1, s2;
for (; n <= m; n++)
{
Select(H, n - 1, s1, s2);
H[n].weight = H[s1].weight + H[s2].weight;
H[s1].parent = H[s2].parent = n;
//如何限制让这两个已经被取出来使用过的元素在后面的循环不再被使用:
//在Select函数里面添加限制条件:
//我们只筛选比较选中范围内parent属性为0的元素
H[n].lchild = s1;
H[n].rchild = s2;
}
Check过标准答案以后发现的问题:
(1):我们新的元素应该从(n+1)开始
(2):必须要新设定一个新的变量 i 来记录后续遍历的整个过程而不能直接通字母n吗?
我觉得:(不一定对哈,还

文章详细讨论了哈夫曼树的构造过程,包括基本的构建步骤和核心原理。作者在代码实现中遇到并分析了两个关键问题:2n和2*n的区别,以及连续赋值的影响。在构造过程中,作者提出了一种选择最小节点的方法,并对比了标准答案的实现方式。最后,给出了完整的哈夫曼树创建代码。
最低0.47元/天 解锁文章
739

被折叠的 条评论
为什么被折叠?



