哈夫曼树的创建

哈夫曼树是一种带权路径长度最短的二叉树,用于创建哈夫曼编码。文章描述了通过使用最小堆来动态合并权值最小的节点,构建哈夫曼树的过程。在每次合并中,将两个权值最小的树组合成新的二叉树,并将新树的权值插入堆中,直至只剩下一个节点,即为哈夫曼树。
摘要由CSDN通过智能技术生成
//哈夫曼树与哈夫曼编码
/*哈夫曼树:有n个叶子结点的二叉树,并且每个叶子结点的权值是w,,从根节点到叶子结点的距离为l
   则每个叶子结点的带权路径长度之和就是这个树的带权路径长度。*/ 
//构造哈夫曼树:把权值最小的两棵树合并,合并以后树的权值为这两个树权值的和,然后再进行合并。
typedef struct TreeNode{
	int weight;//权值
	struct TreeNode * left,right;
}HuffmanTree; 
HuffmanTree * Huffman_creat(MinHeap * H){//哈夫曼树的本质就是每次从现有元素的权值中找出
                                         //两个最小的,然后将他们组合成一个新的二叉树
										 //对于最小的权值,我们可以将所有元素的权值存入堆中
										 //利用最小堆找最小权值,最小堆里存储的是加了权值节点的指针 
	int i;
	HuffmanTree * T;
	Minheap_creat(H);
	for(i=1;i<H->size;i++){ //合并i-1次后旧结点和合成后的新节点都被遍历 
		T=(HuffmanTree*)malloc(sizeof(HuffmanTree));
		T->left=deleteMin(H);
		T->right=deleteMin(H);
		T->wight=T->left->weight+T->right->weight;
		Insert(H,T);//将组合后的那个新节点再插回最小堆,后面的遍历中依然会考虑这个新节点的权值。 
	} 
	T=deleteMin(H);
	return T;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
哈夫曼树创建算法可以分为以下几步: 1. 统计每个字符在待编码字符串中出现的频率,并将其存储在一个数组中。 2. 将数组中的元素构建成森林,每个元素作为一棵只包含自己的树。 3. 选取森林中权值最小的两棵树进行合并,生成一棵新的树,新树的根节点权值为两棵树根节点权值之和。 4. 将新生成的树插入到森林中,并从森林中删除原来的两棵树。 5. 重复步骤3和步骤4,直到森林中只剩下一棵树,即哈夫曼树。 下面是一个基于数组实现的哈夫曼树创建算法的伪代码: ``` // 定义一个节点结构体 struct Node { int weight; // 权值 int parent; // 父节点 int left; // 左子节点 int right; // 右子节点 }; // 创建哈夫曼树的函数 void createHuffmanTree(Node *tree, int *weights, int n) { // 初始化森林,每个节点作为一棵只包含自己的树 for (int i = 0; i < n; i++) { tree[i].weight = weights[i]; tree[i].parent = -1; tree[i].left = -1; tree[i].right = -1; } // 合并森林中的树,直到森林中只剩下一棵树 for (int i = 0; i < n - 1; i++) { int min1 = INT_MAX, min2 = INT_MAX; // 记录森林中权值最小的两棵树 int min1Index = -1, min2Index = -1; // 在森林中找到权值最小的两棵树 for (int j = 0; j < n + i; j++) { if (tree[j].parent == -1) { // 只考虑还没有被合并的树 if (tree[j].weight < min1) { min2 = min1; min2Index = min1Index; min1 = tree[j].weight; min1Index = j; } else if (tree[j].weight < min2) { min2 = tree[j].weight; min2Index = j; } } } // 合并权值最小的两棵树 tree[min1Index].parent = n + i; tree[min2Index].parent = n + i; tree[n + i].weight = tree[min1Index].weight + tree[min2Index].weight; tree[n + i].left = min1Index; tree[n + i].right = min2Index; } } ``` 在这个算法中,我们使用了一个节点结构体来表示哈夫曼树中的每个节点,包括节点的权值、父节点、左子节点和右子节点。我们首先初始化森林,每个节点作为一棵只包含自己的树。然后,我们重复执行选择权值最小的两棵树进行合并的操作,直到森林中只剩下一棵树为止。最终生成的树就是哈夫曼树
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值