数据结构与算法基础(王卓)(22):哈夫曼树

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

目录

前置条件:(哈夫曼树结构构造)

哈夫曼树构造(创建)过程:

基本核心流程(原理):

Part 1:

(1):2n和2 * n 完全不一样

(2):这里连续赋值的语句影响程序的最终结果吗

Part 2:

第一版:

Check过标准答案以后发现的问题:

最终版:

Select函数:

个人版本(我写的版本):

当然了,其中筛选判断语句是否执行的部分也可以更改成:

找到的一些标准答案的写法:(遍历思路结构有一些不同)

所以说,除了算法复杂度的问题之外,不用他这里赋初值的方式而是像我一样直接放第一个值是否可行???

最终成品:


前置条件:(哈夫曼树结构构造)

#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吗?

我觉得:(不一定对哈,还

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值