树、森林与二叉树的转换和哈夫曼树

前言:你和一个修仙的人在草地上看到了一棵树,你说那棵树好漂亮,大仙说:“不那是一片森林,无数棵树在森林里”。所以说树和森里可以互相转换。(这里乱说一通,哈哈哈)

一、树转化为二叉树

下面看一棵普通的树

树、森林与二叉树的转换和哈夫曼树_第1张图片

转化方法:

1.把所有兄弟结点连接起来

2.删掉除了结点第一个左孩子外的连线

变成了这个样子

树、森林与二叉树的转换和哈夫曼树_第2张图片

3.旋转45度

变成这个样子

树、森林与二叉树的转换和哈夫曼树_第3张图片

完成了

二、森林转化为二叉树

下面看一片森林

树、森林与二叉树的转换和哈夫曼树_第4张图片

1.将每一棵树转化为二叉树

2.将每个二叉树根结点连接起来

变为这样

树、森林与二叉树的转换和哈夫曼树_第5张图片

3.旋转45度

树、森林与二叉树的转换和哈夫曼树_第6张图片

完成了

三、二叉树转换为树或者森林

1.如果结点X是结点Y的左孩子,那么将结点X的右孩子,右孩子的右孩子,右孩子的右孩子的右孩子.......与结点Y相连

2.去除双亲结点的与右孩子的连线

3.旋转角度

四、哈夫曼树

原理:树的带权路径长度最小(WPL)

用途:无损压缩,通信行业传输消息等等

(咋们先搞清几个定义)

结点的路径长度:从根结点到该结点的连线条树

树的路径长度:每个叶子结点的路径长度之和

结点的带权路径长度:结点的路径长度与该结点权值的乘积

树的带权路径长度最小(WPL):每个叶子结点的带权路径长度之和

方法:1.从结点中选权值最小的两个结点,较小的放在左边,把他们的权值之和放入一个新结点作为双亲结点

树、森林与二叉树的转换和哈夫曼树_第7张图片

           2.从结点中选最小的一个放在第二层,如果比新创建的结点小就放在左边,反则放在右边。把他们的权值之和放入一个新结点作为双亲结点

树、森林与二叉树的转换和哈夫曼树_第8张图片

             3.如果还有结点,按照方法2一直进行,直到所有结点放在树中

你可能感兴趣的:(数据结构)