数据结构与算法笔记 lesson 22 树与二叉树的转换与赫夫曼树

来源:互联网 发布:java基础看不懂 编辑:程序博客网 时间:2024/06/05 03:00

 树到二叉树的转换

加线,在所有兄弟结点之间加一条连线。

去线,对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线

层次调整,以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明

森林转换为二叉树

把每棵树转换为二叉树

第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根节点的右孩子,用线连接起来。

二叉树转换为树,森林

把以上步骤反过来

判断一棵二叉树能够转换成一棵树还是森林,标准很简单,那就是只要看这棵二叉树的根结点有没有右孩子,有就是森林,没有就是一棵树

森林的遍历

森林的遍历也分前序遍历和后续遍历,其实就是按照数的先根遍历和后跟遍历依次访问森林的每一棵树

树,森林的前序遍历和二叉树的前序遍历结构相同,树,森林的后序遍历和二叉树的中序遍历结构相同

赫夫曼树

例如学生的考试成绩

if(a<60)printf("不及格")else if(a<70) printf("及格")else if(a<90) printf("良好")else printf("优秀")

在实际情况中,假如各个分数段的比例如下

0~5960~6970~8990~1005%15%70%10%

因为良好的人数最多,所以大部分情况需要经过三次判断。为提高效率,可改为

if(a>90) printf("优秀")else if(a>70) printf("良好")else if(a>60)  printf("及格")else printf("不及格")

 把这两棵二叉树简化成叶子结点带权的二叉树


结点的路径长度:

从根结点到该结点的路径上的连接数。

树的路径长度:

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

结点带权路径长度

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

树的带权路径长度

WPL(Weight Path Length) 是树中所有叶子结点的带权路径长度之和

WPL的值越小,说明构造出来的二叉树性能最优

构造最优二叉树

选出两棵根结点的权值最小的二叉树

合并两棵选出的二叉树,增加一个新结点作为新二叉树的根,权值为左右孩子的权值之和

依次重复以上步骤

 

0 0
原创粉丝点击