一、课程目标
了解二叉树的三序遍历方式,能够指出任意二叉树的三序遍历结果,能够根据遍历结果反推出树的结构。
二、三序遍历
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次访问。在访问过程中对结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
1. 遍历方案
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
- 访问结点本身(N)
- 遍历该结点的左子树(L)
- 遍历该结点的右子树(R)
以上三种操作有六种执行次序:
NLR、LNR、LRN、NRL、RNL、RLN。
注意:
前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。
2. 遍历命名
根据访问结点操作发生位置命名:
- NLR:前序遍历(Preorder Traversal 亦称(先序遍历))
——访问根结点的操作发生在遍历其左右子树之前。 - LNR:中序遍历(Inorder Traversal)
——访问根结点的操作发生在遍历其左右子树之中(间)。 - LRN:后序遍历(Postorder Traversal)
——访问根结点的操作发生在遍历其左右子树之后。
注意:
由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。
3. 遍历算法
若二叉树非空,则三序遍历可依次执行以下操作:
- 先(根)序遍历的递归算法定义
- 访问根结点
- 遍历左子树
- 遍历右子树
- 中(根)序遍历的递归算法定义
- 遍历左子树
- 访问根结点
- 遍历右子树
- 后(根)序遍历得递归算法定义
- 遍历左子树
- 遍历右子树
- 访问根结点
4. 示例
如图为一颗二叉树以及该二叉树的三序遍历流程图:
- 先序遍历
遍历结果:1 2 7 12 3 5 10 15
- 中序遍历
遍历结果:7 2 12 1 10 5 15 3
- 后序遍历
遍历结果:7 12 2 10 15 5 3 1
三、结构反推
在信奥赛中经常会遇到这种题:
已知一颗二叉树的中序遍历结果为:DBEAFCG、后序遍历的结果为:DEBFGCA。
试指出该树的先序遍历的结果。
分析:
求解该种类型的题,需要熟练运用三序遍历各自的特质:
- 先序遍历为先根后左右,即序列中最左边节点为根节点。
- 中序遍历为先左后根后右,若已知根节点,可借此划分开左右子树。
- 后序遍历为先左右后根,即序列中最右边节点为根节点。
由以上三点可知,先序、后序可以确定根节点,中序可以划分左右子树,在划分开的左右子树又可以根据先序、后序序列来确定根节点,如此不断的确定和划分,即可还原出整棵树的结构。
在例题中,中序遍历结果为:DBEAFCG、后序遍历的结果为:DEBFGCA,解题流程如下:
- 由后序遍历确定整棵树的根节点为A。
- 由中序遍历确定A节点的左子树有B、D、E三个节点、右子树有C、F、G三个节点。
- B、D、E三个节点在后序序列中顺序为DEB,所以B节点为该子树的根节点。
- B、D、E三个节点在中序序列中顺序为DBE,已知B为根节点,所以左儿子为D,右儿子为E。
- C、F、G三个节点在后序序列中顺序为FGC,所以C节点为该子树的根节点。
- C、F、G三个节点在中序序列中顺序为FCG,已知C为根节点,所以左儿子为F,右儿子为G。
画出树结构为:
得出先序遍历结果:ABDECFG