算法基础(九):超详细最优二叉树构建(2)求编码

从叶子到跟逆向求每个字符的赫夫曼编码:

void GetHuffmanCode(HuffmanTree &HT,HuffmanCode &HC,int n)
{
	char* cd;
	int c;
	int f;
	int start;
	int i = 0;
	//从叶子到根逆向求每个字符的哈夫曼编码
	printf("\n进入求编码函数...");
	HC = (HuffmanCode)malloc( (n+1) * sizeof(char*));		//分配n个字符编码的头指针向量
	cd = (char*)malloc(n*sizeof(char));		//分配求编码的工作空间,n个,因为有n个叶子节点
	cd[n - 1] = ‘\0‘;						//编码结束符
	for(i = 1;i <= n;++i)					//逐个字符求哈弗曼编码
	{
		start = n - 1;						//编码结束符位置
		for(c = i,f = HT[i].parent;f != 0;c = f,f = HT[f].parent)	//f!=0保证一直朝上走,走到根节点
		{
			if(HT[f].lchild == c)	//判断是否为左孩子
				cd[--start] = ‘0‘;
			else cd[--start] = ‘1‘;	//右孩子			

		}
		//退出循环,第i个叶子节点的huffmancode求出,开辟空间,然后赋值,因为HC是char**类型
		HC[i] = (char*)malloc( (n - start) * sizeof(char));
		strcpy(HC[i],cd+start);
		printf("\n编号为:%d,权值为:%d的哈弗曼编码为:",i,HT[i].weight);
		puts(HC[i]);
	}
	free(cd);	//释放工作空间

这段代码加到上一篇文章的头文件里或者main.cpp里面都可以,main.cpp如下:

#include"stdafx.h"
//#include"BasicGraph2.h"
#include "HuffmanCode.h"
void main()
{
	HuffmanTree HT;
	HuffmanCode code;
	int n = 8;
	int m = 15;
	int arr[] = {5,29,7,8,14,23,3,11};
	if(HuffmanCoding(HT,arr,n))	//构建哈弗曼树
		ShowHT(HT,n);			//测试是否正确
	GetHuffmanCode(HT,code,n);	//求哈弗曼编码,结果保存在code中
}

运行结果:

结构图:

注意:8号和11号和我最初画的位置相反。

时间: 2024-10-01 01:15:18

算法基础(九):超详细最优二叉树构建(2)求编码的相关文章

算法基础(八):超详细最优二叉树构建(1)

赫夫曼(Huffman)树也称最有二叉树,是一类带全路径长度最短的树,有着广泛的应用.比如一棵判定树,根据学生的成绩划分及格还是不及格还是优.中等.良好.显然用if-else或者switch就可以简单实现,当然可以直接毫不考虑的直接这样写,但是如果我们再肯花点功夫,就可以得到更加高效的程序.我们可以以学生的总的学科分数的占的各个分数段的比率为权,构造一棵赫夫曼树,这样可以减少比较次数,提高程序运行效率. 构造赫夫曼树的方法步骤其实很简单--赫夫曼算法: (1). 根据给定的n个权值{w1,w2,

WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

总述 在前一篇文章中,讲解了如何将OPENH264编解码器集成到WebRTC中,但是OPENH264只能编码baseline的H264视频,而且就编码质量而言,还是X264最好,本文就来讲解一下如何将X264编码器集成到WebRTC中,为了实现解码,同时要用到ffmpeg.总体流程和之前一样,分为重新封装编解码器和注册调用两大步骤,注册调用这一步没有任何不同,主要是重新封装这一步骤有较大区别. 重新封装X264编码功能 首先当然还是要下载X264源码编译出相应的库以供调用.在windows下使用

【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解

喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 .该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型.粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解.

九章算法 基础算法 强化算法 系统设计 大数据 安卓 leetcode 高清视频

leetcode 直播视频讲座录像 九章算法视频录像,PPT 算法班,算法强化班,Java入门与基础算法班,big data项目实战班,Andriod项目实战班 九章算法下载 九章算法面试 九章算法leetcode 九章算法答案 九章算法mitbbs 九章算法班 九章算法ppt 九章算法录像 九章算法培训 九章算法微博 leetcode 视频 九章算法偷录 算法培训 算法班课程大纲: 1 从strStr谈面试技巧与Coding Style(免费试听) 2 二分搜索与旋转排序数组 Binary S

哈夫曼树(最优二叉树)及哈夫曼算法

哈夫曼树 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码. 首先介绍什么是哈夫曼树.哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数).树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权

算法核心——空间复杂度和时间复杂度超详细解析

算法核心——空间复杂度和时间复杂度超详细解析 一.什么是算法 算法: 一个有限指令集 接受一些输入(有些情况下不需要收入) 产生输出 一定在有限步骤之后终止 每一条指令必须: 有充分明确的目标,不可以有歧义 计算机能处理的范围之内 描述应不依赖于任何一种计算机语言以及具体的实现手段 其实说白了,算法就是一个计算过程解决问题的方法.我们现在已经知道数据结构表示数据是怎么存储的,而“程序=数据结构+算法”,数据结构是静态的,算法是动态的,它们加起来就是程序. 对算法来说有输入,有输出,相当于函数有参

【算法设计与分析基础】22、最优二叉查找树

package cn.xf.algorithm.ch08DynamicProgramming; import java.util.Arrays; import org.junit.Test; import cn.xf.algorithm.ch08DynamicProgramming.vo.ResultVo; /** * 最优二叉树问题 * * 思路:根据最优二叉树的问题就是查找对应的节点的比较次数的期望值保持最小 * 最优二叉查找树的期望搜索代价保持最小 * 例如:一颗树有节点{k0,k1,k2

超强、超详细Redis数据库入门教程

这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介8.redis数据结构 – strings9.redis数据结构 – lists10.redis数据结构 – 集合11.redis数据结构 – 有序集合12.redis数据结构 – 哈希13.聊聊

超详细Redis入门教程【转】

这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用redis 4.学会安装redis 5.学会启动redis 6.使用redis客户端 7.redis数据结构 – 简介 8.redis数据结构 – strings 9.redis数据结构 – lists 10.redis数据结构 – 集合 11.redis数据结构 – 有序集合 12.redis数据结