目录
逻辑雏形
根据老师讲解的思路,梳理出程序运行的逻辑雏形如下:
- 搞一个多维数组HC,用来存储我们这里 n(每) 个节点的哈夫曼编码
- 搞一个数组cd,用来存储我们这里每个节点是前面一位的左子树(0)还是右子树(1),给cd最后一位放结束存储字符
- 反复向上回溯:每次都通过找(parent)来判断自己是左子树还是右子树,并且在cd表里记录每次的查询结果,然后再继续向上回溯看上一层(parent),在进行同样(相同)的循环操作
- 给HC开辟相应的,每个节点对应需要的存储空间大小的空间
- 每算完一个节点的哈夫曼编码就把它放(复制)到HC里面
- 释放空间,结束
需要注意的是,由于我们的函数抬头是:
void CreatHuffmanCode(HuffmanTree HT, HuffmanCode& HC, int n)
也就是说我们在一开始的时候,就已经传进来了一颗哈夫曼树,所以我们这里在函数里面不用再重新重复算一遍哈夫曼树
第一步:
创建二维数组HC,同时也要确定(定义)下来【HuffmanCode】的类型是什么
typedef char **HuffmanCode;
//typedef char** HuffmanCode;
void CreatHuffmanCode(HuffmanTree HT, HuffmanCode& HC, int n)
{
HC = new char *[n + 1];
}
(1):这里,关于这个定义我们可以这样来理解:
HuffmanCode是一个内部内容为char类型的一个多维数组(这里应该是二维数组)
*(*HuffmanCode):表示二维数组的子集:
表示若干个一维数组,每个数组都是一个char类型的一个一维数组
**HuffmanCode:一个二维数组
由若干个char类型一维数组组成的一个二维数组
其中每一个一维数组又可以分为若干个char类型的元素/结点
另外,这里关于开辟空间new的格式使用规则,感觉还是有点不稳的可以直接看:
数据结构与算法基础(王卓)(8)附:关于new的使用方法详解_数据结构中的new_宇 -Yu的博客-优快云博客
(2):为什么我们给他分配(n+1)个元素(格子)???
猜测:
可能是因为(第)一个用来放表头(头结点),然后后面还有(n)个节点
第二步:
给数组cd开辟空间,标准答案:
char* cd = new char[n]; //分配存放临时存放编码的动态数组空间
cd[n - 1] = '\0';
可是我觉得不对吧,为什么在数组倒数第二个位置上放空字符啊?
根据前面实际(操作)的案例,空字符不应该是放在最后一位吗??

文章详细讨论了如何构建哈夫曼编码的过程,包括创建二维数组HC和cd,以及生成编码的逻辑。作者分析了个人版本与标准答案的差异,指出在处理编码存储和回溯过程中的问题,并提出了修改后的解决方案,特别关注了数组空间分配和哈夫曼树节点的关系。
最低0.47元/天 解锁文章
960

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



