哈夫曼树的实现C语言

#include<stdio.h>
#include<stdlib.h>

typedef struct treenode
{
	int weight;
	int parent;/*父节点和孩子节点对应的索引*/ 
	int lchild;
	int rchild;
}treenode;
 
typedef struct HFtree
{
	treenode* node;
	int length;
}HFtree;

HFtree* initHFtree(int* weight,int length)//传入权值
{
	HFtree* T= (HFtree*)malloc(sizeof(HFtree));
	T->node  = (treenode*)malloc(sizeof(treenode)*(2*length-1));//最后的节点个数是2*length-1
	T->length = length;
	int i;
	for(i = 0;i<length;i++)
    {
    	T->node [i].weight = weight[i];
    	T->node [i].parent = 0; 
    	T->node [i].lchild = -1;
    	T->node [i].rchild = -1;//处理前每一个节点都没有子树 
	}
	
	return T;
}

int* selectMin(HFtree* T)//选出最小和次小 
{
	int min = 1000;
	int second = 1000;
	int minindex,secondindex,i;
	
	for(i = 0;i<T->length;i++)
	{
		if(T->node [i].parent==0)//没有当过孩子节点的节点 
		{
	       	if(T->node [i].weight<min)
	    	{
		    	min = T->node [i].weight;
	    		minindex = i;
	    	}
	    }
	}
	for(i = 0;i<T->length ;i++)
	{
		if(T->node [i].parent==0&&i!=minindex)
		{
		    if(T->node [i].weight<second)
	    	{
	    		second = T->node [i].weight;
		    	secondindex = i;
		    }
	    }
	}
	int* res;//用指针储存最小和次小值的下标,这样就可以同时返回两个值 
	res = (int*)malloc(sizeof(int)*2);
	res[0] = minindex;
	res[1] = secondindex;
	
	return res;
}

void createHFtree(HFtree* T)
{
	int* res;
	int min,second,i;
	int length = T->length ;
	int fin = T->length *2-1;
	
	for(i =T->length ;i<fin;i++)
	{
		res = selectMin(T);
		min = res[0];
		second = res[1];
		T->node[i].weight = T->node [min].weight+T->node [second].weight;
		T->node [i].lchild = min;
		T->node [i].rchild = second;//该节点有了左孩子和右孩子
		T->node [min].parent = i;
		T->node [second].parent = i;//左右孩子有了父节点 
		length++;//节点加一 
	}
}
	

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于数组的哈夫曼树权值实现的示例代码,供您参考: ```c #include <stdio.h> #define MAX_NODE_NUM 1000 // 哈夫曼树节点结构体 typedef struct { int weight; // 权值 int parent; // 父节点 int leftChild; // 左孩子 int rightChild; // 右孩子 } HuffmanNode; // 构建哈夫曼树 void createHuffmanTree(HuffmanNode huffmanTree[], int weight[], int n) { int i, j, k; int min1, min2; // 初始化哈夫曼树 for (i = 0; i < 2 * n - 1; i++) { huffmanTree[i].parent = -1; huffmanTree[i].leftChild = -1; huffmanTree[i].rightChild = -1; } // 设置叶子节点的权值 for (i = 0; i < n; i++) { huffmanTree[i].weight = weight[i]; } // 构建哈夫曼树 for (i = 0; i < n - 1; i++) { min1 = min2 = MAX_NODE_NUM; k = 0; // 查找权值最小的两个节点 for (j = 0; j < n + i; j++) { if (huffmanTree[j].parent == -1 && huffmanTree[j].weight < min1) { min2 = min1; min1 = huffmanTree[j].weight; k = j; } else if (huffmanTree[j].parent == -1 && huffmanTree[j].weight < min2) { min2 = huffmanTree[j].weight; } } // 设置父节点 huffmanTree[k].parent = n + i; huffmanTree[n + i].weight = min1 + min2; // 设置左孩子和右孩子 for (j = 0; j < n + i; j++) { if (huffmanTree[j].parent == -1) { if (huffmanTree[j].weight == min1) { huffmanTree[j].parent = n + i; huffmanTree[n + i].leftChild = j; } else if (huffmanTree[j].weight == min2) { huffmanTree[j].parent = n + i; huffmanTree[n + i].rightChild = j; } } } } } int main() { int i; int weight[] = {5, 6, 8, 7, 15}; int n = sizeof(weight) / sizeof(weight[0]); HuffmanNode huffmanTree[MAX_NODE_NUM]; // 构建哈夫曼树 createHuffmanTree(huffmanTree, weight, n); // 输出哈夫曼树的权值 printf("Huffman Tree Weight:\n"); for (i = 0; i < 2 * n - 1; i++) { printf("%d ", huffmanTree[i].weight); } printf("\n"); return 0; } ``` 在这个代码中,`HuffmanNode` 结构体表示哈夫曼树的节点,包含权值、父节点、左孩子和右孩子等信息。`createHuffmanTree` 函数用于构建哈夫曼树,接收一个 `HuffmanNode` 数组 `huffmanTree`,一个整型数组 `weight` 表示每个叶子节点的权值,以及一个整数 `n` 表示叶子节点的个数。 在构建哈夫曼树的过程中,我们首先初始化哈夫曼树的节点信息,然后将叶子节点的权值设置到节点中。接着,我们进行 `n-1` 次迭代,在每一次迭代中查找权值最小的两个节点,并将它们合并为一个新的节点。最后,我们就可以得到一个完整的哈夫曼树。 在示例代码中,我们使用了一个数组来表示哈夫曼树,节点的下标就是节点的编号。在构建哈夫曼树的过程中,我们通过设置节点的 `parent`、`leftChild` 和 `rightChild` 等属性来表示节点之间的关系。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值