树到二叉树的转换
加线,在所有兄弟结点之间加一条连线。
去线,对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线
层次调整,以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明
森林转换为二叉树
把每棵树转换为二叉树
第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根节点的右孩子,用线连接起来。
二叉树转换为树,森林
把以上步骤反过来
判断一棵二叉树能够转换成一棵树还是森林,标准很简单,那就是只要看这棵二叉树的根结点有没有右孩子,有就是森林,没有就是一棵树
森林的遍历
森林的遍历也分前序遍历和后续遍历,其实就是按照数的先根遍历和后跟遍历依次访问森林的每一棵树
树,森林的前序遍历和二叉树的前序遍历结构相同,树,森林的后序遍历和二叉树的中序遍历结构相同
赫夫曼树
例如学生的考试成绩
if(a<60) printf("不及格") else if(a<70) printf("及格") else if(a<90) printf("良好") else printf("优秀")
在实际情况中,假如各个分数段的比例如下
0~59 60~69 70~89 90~100 5% 15% 70% 10% 因为良好的人数最多,所以大部分情况需要经过三次判断。为提高效率,可改为
if(a>90) printf("优秀") else if(a>70) printf("良好") else if(a>60) printf("及格") else printf("不及格")
把这两棵二叉树简化成叶子结点带权的二叉树
结点的路径长度:
从根结点到该结点的路径上的连接数。
树的路径长度:
树中每个叶子结点的路径长度之和
结点带权路径长度
结点的路径长度与结点权值的乘积
树的带权路径长度
WPL(Weight Path Length) 是树中所有叶子结点的带权路径长度之和
WPL的值越小,说明构造出来的二叉树性能最优
构造最优二叉树
选出两棵根结点的权值最小的二叉树
合并两棵选出的二叉树,增加一个新结点作为新二叉树的根,权值为左右孩子的权值之和
依次重复以上步骤