一、树、二叉树、森林之间的转化
1.树转化成二叉树
树转化成二叉树是通过父亲兄弟结点的转化,即将一个树的左儿子变成其长子,右儿子变成其兄弟
举例:
-
将树以兄弟父亲的方式连接起来
-
将多余连接线擦掉
-
调整角度变成二叉树
2.二叉树转化为树
原来的例子
- 连接父亲与儿子
- 擦去多余的连接线
- 将树旋转过来
3.二叉树森林转为二叉树
举例:
方法: 每一棵二叉树作为前一棵二叉树的右孩子插入
4.将含有多叉树的森林转化为二叉树
- 先利用多叉树转化为二叉树的方法将每棵树转化成二叉树
- 利用二叉树的森林转化成二叉树的方法转化成二叉树
二、树、二叉树、森林的遍历
三个对应关系:
树 | 森林 | 二叉树 |
---|---|---|
先根遍历 | 先序遍历 | 先序遍历 |
后根遍历 | 中序遍历 | 中序遍历 |
1.树的遍历
- 先根遍历:先访问每一棵树的根节点,然后从左到右访问各个子树,与二叉树的先序遍历结果相同
举例:
如图所示:先根遍历的结果:ABEFGCDH - 后根遍历:先从左到右分别访问各个子树,再访问根节点,与二叉树中序遍历结果同
上图所示的例子中,后根遍历的结果:EFGBCHDA
2.森林的遍历
对于森林,由普通的树组成的森林是不存在先序遍历和中序遍历的,因此对于树的遍历,仅考虑森林转化成二叉树后的遍历顺序,规则见3
3.二叉树的遍历
跟1中同样的例子,先转化成二叉树
- 先序遍历:对于每一个子树,以根节点->左子树->右子树的顺序进行访问
该例子先序遍历结果:ABEFGCDH - 中序遍历:对于每一个子树,以左子树->根节点->右子树的顺序进行访问
中序遍历结果:EFGBCHDA