树和森林、 Huffman树

本文介绍了树和森林之间的转换方法,包括树转换为二叉树、森林转换为二叉树以及二叉树转换回树和森林的过程。接着详细阐述了Huffman树的概念,它是具有最小带权路径长度的二叉树,用于实现数据的高效编码。Huffman编码利用权值大小确定编码长度,确保编码无前缀冲突,通过构建Huffman树来得到编码。最后,讨论了Huffman编码的实现思路,涉及查找编码值的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树和森林的转换
树转换为二叉树
加线:在所有兄弟节点之间加一条连线;去线: 对树中每一个节点,只保留它与第一个孩子节点的连 线,删除它与其他孩子节点之间的连线。层次调整:以树的根节点为轴心,将整个树顺时针旋转一定的 角度,使之结构层次分明。
森林转换为二叉树
把每棵树转换为二叉树;第一棵二叉树不动,从第二课二叉树开始,依次把后一课二叉树的根节点作为
前一棵二叉树的根节点的右孩子,用线连接起来。当所有的二叉树连接起来就得到了由森林转换来的二 叉树。
二叉树转换为树
加线:若某节点的左孩子节点存在,则将这个左孩子的有孩子节点、右孩子的右孩子节点、 ... n 个右 孩子节点都作为此节点的孩子,该节点与这些右孩子节点用线连接起来;去线:删除原二叉树中所有节 点与其右孩子节点的连线;层次调整,使之结构层次分明。
二叉树转换为森林
从根节点开始,若右孩子存在,则把右孩子节点的连线删除,再查看分离后的二叉树,若右孩子存在则 删除连线,... ,直到所有右孩子连线都删除为止,得到分离的二叉树;在将每棵分离后的二叉树转换为 树即可。
从树中一个节点到另一个节点之间的分支构成两个节点之间的路径,路径上的分支数目称作路径长度。
树的路径长度就是从树根到每一节点的路径长度之和。对于代权的节点,节点的带权路径长度为从该节 点到树根之间的路径长度与节点上权的乘积。树的带权路径长度为树中所有叶子节点的带权路径长度之 和。最小带权路径长度的二叉树是 Huffffman 树。
构建 Huffffman 树的算法,从待构建的数据集中找出权值最小的数据构建一棵二叉树,该二叉树的权值为 两个权值之和,将这两个最小权值的数据从数据集删除,将构建二叉树的权值放入数据集,依次循环将 所有数据全部读入构建二叉树为止。Huffffman 树算法就是将权值小的数据构建树时离树根远,权值大的 数据离树根近,这样带权路径长度之和为最小。
Huffffman 编码,是对不同权值数据(字符)进行编码的方法,其思路是权值大的数据编码短、权值小的 数据编码长这样最终文章的编码整体长度就会变短。
Huffffman 编码方式是对 Huffffman 树的左子树分支标记为 0 ,右子树分支标记为 1 ,从树根到叶子节点路 径上的01 代码就是 Huffffman 编码。这样得到的 Huffffman 编码的任何一个编码不是另一个字符编码的前 缀。Huffffman 树构建思路:使用 HTNode 结构体数组存储树结构,其大小根据二叉树的特点可计算出为 m = 2*n-1,并将叶子节点信息存入该数组,调用 Select 函数获得没有父节点的两个最小节点,合并构建新 节点,新节点占用一个新未分配的空间,修改相应节点的parent、 lchild rchild 的值,直到构建出所有 的未计算的节点为止。
Huffffman 编码实现思路:叶子节点从下向上查找到根节点过程中获得编码在翻转,从叶子节点出发通过 查找其parent 即可知道当前叶子节点编码值(当前叶子地址与 paretn lchild rchild 比较),如果当前 叶子节点的parent 不是根节点( parent 不等于 0 )则继续用上面的方法向上查找,直到根节点为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值