树和森林的转换
树转换为二叉树
加线:在所有兄弟节点之间加一条连线;去线: 对树中每一个节点,只保留它与第一个孩子节点的连 线,删除它与其他孩子节点之间的连线。层次调整:以树的根节点为轴心,将整个树顺时针旋转一定的 角度,使之结构层次分明。
森林转换为二叉树
把每棵树转换为二叉树;第一棵二叉树不动,从第二课二叉树开始,依次把后一课二叉树的根节点作为
前一棵二叉树的根节点的右孩子,用线连接起来。当所有的二叉树连接起来就得到了由森林转换来的二 叉树。
二叉树转换为树
加线:若某节点的左孩子节点存在,则将这个左孩子的有孩子节点、右孩子的右孩子节点、
...
、
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
)则继续用上面的方法向上查找,直到根节点为止。