数据结构【完整代码】之(C语言实现【哈夫曼树的存储结构与创建】)

本文包含两个文件的代码和一张测试效果图:

  • HuffmanTree.h文件: 哈夫曼树的存储结构与创建函数
  • HuffmanCreatTest.cpp文件: 用于测试
  • 效果图:(如下)

效果图:
在这里插入图片描述

HuffmanTree.h文件:

#include <stdio.h>
#include <stdlib.h>
 
typedef struct{
	int weight;
	int parent,lchild,rchild;
}HTNode, *HuffmanTree;
 
void Select(HuffmanTree HT, int n, int *s1, int *s2)
{
    int minum;      // 定义一个临时变量保存最小值?
    for(int i = 1; i <= n; i++)     // 以下是找到第一个最小值
    {
        if(HT[i].parent == 0)
        {
            minum = i;
            break;
        }
    }
    for(int i = 1; i <= n; i++)
    {
        if(HT[i].parent == 0)
            if(HT[i].weight < HT[minum].weight)
                minum = i;
    }
    *s1 = minum;
    // 以下是找到第二个最小值,且与第一个不同
    for(int i = 1; i <= n; i++)     
    {
        if(HT[i].parent == 0 && i != *s1)
        {
            minum = i;
            break;
        }
    }
    for(int i = 1; i <= n; i++)
    {
        if(HT[i].parent == 0 && i != *s1)
            if(HT[i].weight < HT[minum].weight)
                minum = i;
    }
    *s2 = minum;
}
 
void CreateHuffmanTree(HuffmanTree &HT, int *w, int n)
{
	if(n <= 1){
		return;
	}	
	int m, i, s1, s2;
	m = 2 * n - 1;
    HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 分配空间
    for(i = 1; i <= m; i++){ //将1~m号结点初始化 
        HT[i].weight = w[i];
        HT[i].parent = 0;
        HT[i].lchild = 0;
        HT[i].rchild = 0;
    }
    printf("\n哈夫曼树是: \n");
 	int num = 1;
    for(i = n + 1; i <= m; i++){ //通过n-1次的【选择】、【删除】、【合并】来创建哈夫曼树   
		
		//【选择】在HT[k](1<=k<=i-1)中选择两个:双亲域为0且权值最小的结点,并返回它们在HT中的序号s1和s2
		Select(HT, i-1, &s1, &s2);
        
        //【删除】得到新结点i,从森林中删除s1,s2,即将s1和s2的双亲域由0改为i 
		HT[s1].parent = i;
		HT[s2].parent = i;

        // 【合并】将s1和s2的权值和作为一个新结点的权值依次存入到数组的第n+1之后的单元中,同时记录这个新结点左孩子的下标s1,右孩子的下标为s2
		HT[i].lchild = s1;
		HT[i].rchild = s2;
		HT[i].weight = HT[s1].weight + HT[s2].weight;
		if(i <= m - 1){
			printf("%d (%d, %d)\n", HT[i].weight, HT[s1].weight, HT[s2].weight);
		}
		else{
    		printf("T: (%d, %d)\n", HT[s1].weight, HT[s2].weight);
		}
    }
    printf("\n");
}

HuffmanCreatTest.cpp文件:

#include "HuffmanTree.h"

int main()
{
    HuffmanTree HT;
    int n;
    printf("输入叶子结点的数量:");
    scanf("%d", &n);
    int w[n+1]; 
 
    for(int i=1; i<=n; i++)
    {
    	printf("\n输入第%d个结点的权值:", i);
        scanf("%d", &w[i]);
    }
    CreateHuffmanTree(HT, w, n);
}
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超周到的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值