13、二叉树的遍历

 

一、课程目标

了解二叉树的三序遍历方式,能够指出任意二叉树的三序遍历结果,能够根据遍历结果反推出树的结构。

二、三序遍历

所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次访问。在访问过程中对结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

1. 遍历方案

从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:

  1. 访问结点本身(N)
  2. 遍历该结点的左子树(L)
  3. 遍历该结点的右子树(R)

以上三种操作有六种执行次序:
NLR、LNR、LRN、NRL、RNL、RLN。
注意:
前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。

2. 遍历命名

根据访问结点操作发生位置命名:

  1. NLR:前序遍历(Preorder Traversal 亦称(先序遍历))
    ——访问根结点的操作发生在遍历其左右子树之前。
  2. LNR:中序遍历(Inorder Traversal)
    ——访问根结点的操作发生在遍历其左右子树之中(间)。
  3. LRN:后序遍历(Postorder Traversal)
    ——访问根结点的操作发生在遍历其左右子树之后。

注意:
由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

3. 遍历算法

若二叉树非空,则三序遍历可依次执行以下操作:

  • 先(根)序遍历的递归算法定义
  1. 访问根结点
  2. 遍历左子树
  3. 遍历右子树
  • 中(根)序遍历的递归算法定义
  1. 遍历左子树
  2. 访问根结点
  3. 遍历右子树
  • 后(根)序遍历得递归算法定义
  1. 遍历左子树
  2. 遍历右子树
  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,解题流程如下:

  1. 由后序遍历确定整棵树的根节点为A。
  2. 由中序遍历确定A节点的左子树有B、D、E三个节点、右子树有C、F、G三个节点。
  3. B、D、E三个节点在后序序列中顺序为DEB,所以B节点为该子树的根节点。
  4. B、D、E三个节点在中序序列中顺序为DBE,已知B为根节点,所以左儿子为D,右儿子为E。
  5. C、F、G三个节点在后序序列中顺序为FGC,所以C节点为该子树的根节点。
  6. C、F、G三个节点在中序序列中顺序为FCG,已知C为根节点,所以左儿子为F,右儿子为G。

画出树结构为:

得出先序遍历结果:ABDECFG

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值