数据结构与算法

第六章树的操作

2019-11-23  本文已影响0人  洋之_

1,遍历二叉树的顺序和3中不同的打印顺序
2,什么是线索二叉树,其原理是什么,解决了什么问题?
3,树转化为二叉树的过程,及二叉树转化为树的过程。
4,森林转为二叉树的过程,二叉树转化为森林的过程
5,树的遍历,和森林的遍历
6,郝夫曼树的定义及带权路径的定义
7,郝夫曼树构建过程
8 什么是郝夫曼编码


1,遍历二叉树的顺序和3中不同的打印顺序
遍历的顺序都是一样的,先根结点再子结点,再从左到右。
前序遍历,遍历结点前打印结点。
中序遍历,遍历完左子树之后要遍历右子树前打印结点。
后序遍历,遍历完该结点的所有孩子结点后再打印该结点。
2,什么是线索二叉树,其原理是什么,解决了什么问题?
加上线索的二叉链表称为线索链表树(指向前驱后继的指针称为线索)
原理,空指针的个数比结点个数多1,可以用空指针指向该结点的前驱后继。
如果该结点有左孩子结点就指向其左孩子结点,如果没有就指向其前驱。
为了区分是指向其孩子结点还是前驱后继,增加了2个极小的标识域(ltag,rtag,0表示指向孩子,1表示指向前驱/后继)
解决的问题,解决了二叉树结点只指向孩子结点难以找到双亲结点的过程。
3,树转化为二叉树的过程,及二叉树转化为树的过程。
1,加线,所有兄弟结点间加一个线。
2,去线,树中的每个结点只保留它与第一个孩子结点的连线,删除它与其它孩子结点的连线。
3,层次调整,以树的根为轴心,将整颗树顺时针旋转一定角度,使之结构分明(第一个孩子是结点的左孩子,兄弟转过来的孩子是结点的右孩子)
二叉树转为树
1,加线,若结点的左孩子结点存在。将左孩子结点的右孩子结点,右孩子的右孩子,右孩子的右孩子的右孩子...... 全部作为该结点的孩子。
2,去线,删除原二叉树中所有结点与其右孩子的结点的连线
3,层次调整,使其结构层次分明。

4,森林转为二叉树的过程,二叉树转化为森林的过程
森林转为二叉树的过程
1,把每个树转为二叉树。
2,第一树不动,以后每棵树的根结点作为上棵树的根节点的右孩子(如何这棵树本身就是二叉树呢)

二叉树转化为森林
条件 如果一个二叉树的根结点有右孩子,那么久可以转化成森林
1,从根结点开始,若有右孩子则删除连线。分离后的二叉树还有右孩子则连线删除。
2,再将分离的树转化成二叉树。

5,树的遍历,和森林的遍历

先根遍历

先访问树的根结点
再依次先根遍历根的每棵子树

后根遍历

先依次后根遍历每棵子树
然后再访问根结点

前序遍历
先访问森林中的第一棵树的根结点,再依次先根遍历根的每棵子树。
再用同样的方式遍历除了第一棵树的森林

后序遍历
先访问森林中的第一棵树,后根遍历的方式遍历每棵子树,然后再访问根结点。
再用同样的方式遍历除了第一棵树的森林

6,郝夫曼树的定义及带权路径的定义
带权路径长度
所有叶子结点的带权路径长度之和
郝夫曼树
带权路径长度最小的二叉树称为郝夫曼树

7,郝夫曼树构建过程
1,把所有有权值的叶子结点按照从小到大的顺序排成一个有序序列。
2,取序列中最小的2个结点作为一个新结点N1,新结点的权值为2个结点的和。
3,将新的结点插入队列中保持由小到大的顺序。直到形成新的根结点。

8 什么是郝夫曼编码
1,设置需要编码的字符集为{d1,d2,d3...dn},
2,各个字符在电文中出现的次数或频率集合为{w1,w2,...wn}
3,以d 作为叶子结点,以w 作为叶子的权重。规定郝夫曼树的左枝为0右枝为1 。
4,从根结点到叶子结点,所经过的路径分支构成的0和1的序列便为该结点对应字符的编码,这就是郝夫曼编码。

上一篇 下一篇

猜你喜欢

热点阅读