一、树、森林与二叉树的转换
1、前言
前面介绍树的存储结构时,总共有三种表示法(双亲表示法、孩子表示法和孩子兄弟表示法)。
在树、森林与二叉树的转换中,我们的思想用到的是孩子兄弟表示法存储结构(二叉树表示法)。
2、树转二叉树
【1】步骤
结点的左指针指向它的第一个孩子,结点的右指针指向它的后一个兄弟(即左孩子,右兄弟)。
【2】例子
【3】注解
①根是没有兄弟的,所以转换的结果一定是没有右子树的。
②树转换为的二叉树,二叉树中无右孩子的结点个数 = 原树中分支结点个数+1。
③二叉树中没有左孩子的结点在原树中表现为叶子。
3、二叉树转树
【1】步骤
树转二叉树的逆过程。
比如还原结点A的孩子——结点A的左孩子开始,一直向右走,这些结点就是结点A的孩子,遇见顺序就是它们作为结点A孩子的顺序。
【3】注解
①对于G结点,随便怎么画,反正都是第一个,靠左、靠右、正下方都行。
4、森林转二叉树
【1】步骤
①森林中每棵树转二叉树
②转换后的第一棵树根作为最终树的根
③转换后的第一棵树的左子树作为最终树的左子树
④转换后的第n棵树作为第n-1棵树的右子树(n>=2)
【2】例子
【3】注解
二叉树中没有左孩子的结点在原森林中表现为叶子(与树一样),森林转二叉树利用的是右指针,不影响左指针为空的个数,所以与树的结论一致。
5、二叉树转森林
【1】步骤
①拆为森林——根开始一直向右,断开所有向右的边,各自成树
②每棵树——按二叉树转树去做
【2】例子
【3】注解
森林中树的棵数 = 森林中总的结点数-森林中总的边数
二、树、森林的遍历
1、树的遍历
【1】树遍历的两种方式
前序遍历、后序遍历
【2】前序遍历
思想 | 树非空,则先访问根结点;再按从左到右的顺序前序遍历每棵子树 |
注解 | 最终访问顺序,与该树对应的二叉树前序遍历顺序相同 访问过程类似的用编号、描边去做就行 |
【3】后序遍历
思想 | 树非空,则按从左到右的顺序后序遍历每棵子树;再访问根结点 |
注解 | 最终访问顺序,与该树对应的二叉树中序遍历顺序相同 访问过程类似的用编号、描边去做就行 中序?不存在的,根应该在哪棵子树被访问之后去访问呢?不知道 |
【4】例子
2、森林的遍历
【1】森林遍历的两种方式
前序遍历、后序遍历
【2】前序遍历
思想 | 按次序前序遍历每棵树 |
注解 | 最终访问顺序,与该森林对应的二叉树先序遍历顺序相同 访问过程类似的用编号、描边去做就行 |
【3】后序遍历
思想 | 按次序后序遍历每棵树 |
注解 | 最终访问顺序,与该森林对应的二叉树中序遍历顺序相同 关于森林的后序遍历、中序遍历,定义和结果是一样的,直接当作同义词处理 访问过程类似的用编号、描边去做就行 |
【4】例子
3、树、森林的遍历与二叉树的遍历的对应关系
树 | 森林 | 二叉树 |
前序遍历 | 前序遍历 | 前序遍历 |
后序遍历 | 后序遍历(中序遍历) | 中序遍历 |