ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构之Huffman(哈夫曼)树

2019-06-13 22:03:55  阅读:235  来源: 互联网

标签:weight 哈夫曼 int HuffNode 权值 HuffmanTree 数据结构 Huffman HuffArray


哈夫曼树

代码自己手撸的 只看了一遍思路 -.- 望指正

思路重现

1.根据给定的n个权值{w1,w2, …wn}构造n棵只有一个叶结点的二叉树,从而得到一个二叉树的集合F = {T1 T2 T3 …Tn}
2.在F中选取根节点的权值最小和次小的两颗二叉树作为左右子树构造一颗新的二叉树,这棵二叉树根节点的权值为其左右子树根节点权值之和。
3.在集合F中删除作为左右子树的两颗二叉树,并将新建的二叉树加入到集合F中
4.重复2.3步骤 直到F只含有一颗二叉树为止,这棵树便是要建立的哈弗曼树

简而言之就是每次找权值最小的两个节点 将其组成一颗二叉树 直到将所有节点达到2n-1个为止
今天从CodeBlocks换成用VS2017 感觉还是VS牛逼!!
#include <stdio.h>
#include <stdlib.h>
#define MAXLEAVES 5  //初始叶子结点数
#define MAXNODE 2*MAXLEAVES - 1 //哈弗曼树的结点总数

/** 规定权值小的为左孩子,权值大的为右孩子*/
#include <stdio.h>
#include <stdlib.h>
#define MAXLEAVES 5  //初始叶子结点数
#define MAXNODE 2*MAXLEAVES - 1 //哈弗曼树的结点总数

/** 规定权值小的为左孩子,权值大的为右孩子*/
typedef struct
{
	int weight; //结点权值
	int parent, left, right;//父节点下标  左右孩子下标
	int flag;//记录该节点是否已经判断过 没有判断过标记为0 判断过标记为1
}HuffNode;

void Init_HuffmanTree(HuffNode HuffArray[], int n);//初始化所有节点
void Create_HuffmanTree(HuffNode HuffArray[]);//根据下标对应权值相加 得到新的权值 并且找到双亲节点
void Show_HuffmanTree(HuffNode HuffArray[], int n);//输出哈夫曼数组
int Select_Sort(HuffNode HuffArray[], int num);//选出权值最小的两个下标

int main()
{
	//分配2n - 1 个结点内存数组
	HuffNode HuffArray[MAXNODE];
	printf("初始化完成的哈夫曼数组:\n");
	Init_HuffmanTree(HuffArray, MAXNODE);
	Show_HuffmanTree(HuffArray, MAXLEAVES);
	printf("构造哈夫曼数组,并输出:\n");
	Create_HuffmanTree(HuffArray);
	Show_HuffmanTree(HuffArray, MAXNODE);

	return 0;
}

/** 初始化哈夫曼数组*/
void Init_HuffmanTree(HuffNode HuffArray[], int n)
{
	int i = 0;
	for (i; i < MAXNODE; i++)//初始化
	{
		HuffArray[i].parent = -1;
		HuffArray[i].left = -1;
		HuffArray[i].right = -1;
		HuffArray[i].flag = 0;
	}
	//为了方便直接给定权值
	HuffArray[0].weight = 28;
	HuffArray[1].weight = 10;
	HuffArray[2].weight = 20;
	HuffArray[3].weight = 7;
	HuffArray[4].weight = 35;

}
/** 创建哈夫曼树*/
void Create_HuffmanTree(HuffNode HuffArray[])
{
	int i = MAXLEAVES;
	int minindex1, minindex2;
	for (i; i < MAXNODE; i++)//确定需要几次大循环
	{
		minindex1 = Select_Sort(HuffArray, i);
		minindex2 = Select_Sort(HuffArray, i);
		HuffArray[i].weight = HuffArray[minindex1].weight + HuffArray[minindex2].weight;
		HuffArray[i].left = minindex1;
		HuffArray[i].right = minindex2;
		HuffArray[minindex1].parent = HuffArray[minindex2].parent = i;
	}
}

void Show_HuffmanTree(HuffNode HuffArray[], int n)
{
	int i = 0;
	printf("下标  权值  双亲下标    左孩子     右孩子		flag\n");
	for (i;i < n;i++)
	{
		printf("%d     %d      %d          %d         %d			%d\n", i, HuffArray[i].weight,
			HuffArray[i].parent,
			HuffArray[i].left,
			HuffArray[i].right,
			HuffArray[i].flag);
	}
}

int Select_Sort(HuffNode HuffArray[], int num)
{
	int m;
	int minIndex;
	for (m = 0;m < num;m++)
	{
		if (HuffArray[m].flag != 1)  // 找的应该是第一个flag不为1的作为最小值 
													// 因为一旦第一个在某次循环中被选中  下一次也就意味着不可再被认为是minindex
		{
			minIndex = m;
			break;
		}
	}
	for (m = 0;m < num;m++)
	{
		if (HuffArray[m].flag != 1)
		{
			if (HuffArray[minIndex].weight > HuffArray[m].weight)
			{
				minIndex = m;
			}
		}
	}
	HuffArray[minIndex].flag = 1;
	return minIndex;
}


标签:weight,哈夫曼,int,HuffNode,权值,HuffmanTree,数据结构,Huffman,HuffArray
来源: https://blog.csdn.net/qq_41099859/article/details/91899092

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有