7、树、森林、二叉树
由于二叉树是一种更确定的数据结构(每个节点最多只有两个子节点),因此它的增删和遍历都比一般的树更加方便和容易实现,反观树的每个节点由于子节点的个数不确定,因此它的增删和遍历都比较复杂。实际上,树、森林和二叉树作为树的类型,他们之间是可以互相转换的。本文主要介绍森林与二叉树的相互转换、树与森林的遍历。
7.1 树转换为二叉树
- 加线:在所有兄弟节点之间增加一条连线
- 去线:对树中的每个节点,只保留每个节点与他的第一个孩子之间的连线,删除与其他孩子之间的连线
调整:以树的根节点为轴心,将整棵树顺时针旋转一定的角度,使之层次结构分明,第一个孩子为二叉树中节点的左孩子,兄弟转换过来的为右孩子。
7.2 森林转换为二叉树
森林是若干棵树的集合,因此森林也可以转换为二叉树,方法如下:
- 把森林中的每棵树都转换为二叉树
- 第一棵二叉树不动,从第二棵二叉树开始,依次将后一棵二叉树的根节点作为前一棵二叉树的右孩子,并用线连接起来。
- 进行调整,使其层次分明
7.3 二叉树转换为树、森林
二叉树转换为树、森林就是将树、森林转换为二叉树的逆过程。其方法如下:
- 加线:如果某节点的左孩子节点存在,则将该节点的左孩子的右孩子节点、右孩子的右孩子节点………都与该节点用线连接起来
- 去线:删除原二叉树中所有节点与右孩子节点 的连线
- 调整:使其结构分明
7.4 树和森林的遍历
树和森林的遍历也是按照某种规律对树或森林中的每个节点进行访问,且仅仅访问一次的操作。
7.4.1 树的遍历
按照访问树中根节点的先后次序,树的遍历分为先根遍历和后根遍历两种。
先根遍历的顺序如下:
- 访问根节点
- 按照从左到右的次序一次先根遍历每一棵子树
后根遍历的实现顺序如下:
- 按照从左到右的顺序依次后根遍历每一棵子树
- 访问根节点
7.4.2 森林的遍历
森林的遍历有先序遍历和中序遍历两种。
先序遍历的方法如下:
- 访问森林中第一棵树的根节点
- 先序遍历第一棵树的根节点的子树
- 先序遍历森林中剩余的子树
中序遍历的方法如下:
- 中序遍历第一棵树的根节点的子节点
- 访问森林中第一棵树的根节点
- 中序遍历森林中剩余的树
7.5 二叉树的确定
- 由先序遍历序列和中序遍历序列可以唯一的确定一棵二叉树
- 由后序遍历序列和中序遍历序列可以唯一的确定一棵二叉树
- 由先序遍历序列和后序遍历序列不能唯一的确定一棵二叉树