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的序列便为该结点对应字符的编码,这就是郝夫曼编码。