第12讲 树的遍历 课堂互动 隐藏答案 | 返回首页

作者:欧新宇(Xinyu OU)

最后更新:2023-11-11


【课前自测12】

1.【2019统考真题】若将一棵树T转化为对应的二叉树BT,则下列对BT的遍历中,其遍历序列与T的后根遍历序列相同的是( )。
A. 先序遍历
B. 中序遍历
C. 后序遍历
D. 按层遍历

答案及解析:B
树的先根遍历与二叉树和森林的先序遍历是等价的;树的后根遍历与森林和二叉树的中序遍历是等价的。此外,有兴趣的同学可以尝试绘制一个三结点的的树(A是根,左孩子B,右孩子C),此时后根遍历的顺序是BCA。当我们将其按照左孩子右兄弟的原则转换成二叉树的时候,A还是根节点,B是A的左孩子,C是B的右孩子。此时,遍历顺序BCA刚好是二叉树的中序遍历。

2. 引入线索二叉树的目的是( )。
A. 加快查找结点的前驱或后继的速度
B. 为了能在二叉树中方便插入和删除
C. 为了能方便找到双亲
D. 使二叉树的遍历结果唯一

答案及解析:A
线索是前驱结点和后继结点的指针,引入线索的目的是加快对二叉树的遍历。

3. 线索二叉树是一种( )结构。
A. 逻辑
B. 逻辑和存储
C. 物理
D. 线性

答案及解析:C
二叉树是一种逻辑结构,但线索二叉树是加上线索后的链表结构,即它是二叉树在计算机内部的一种存储结构,所以是一种物理结构。

4. 设 n, m 为一棵二叉树上的两个结点,在中序遍历时,n 在 m 前的条件是( )
A. n 在 m 右方
B. n 是 m 祖先
C. n 在 m 左方
D. n 是 m 子孙

答案及解析:C
中序遍历访问顺序是左根右,因此只需要保证n在m的左方即可。

5.一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足( )
A. 所有的结点均无左孩子
B. 所有的结点均无右孩子
C. 只有一个叶结点
D. 是任意一棵二叉树

答案及解析:C

6. 下列序列中,不能唯一地确定一棵二叉树的是( )。
A. 层次序列和中序序列
B. 先序序列和中序序列
C. 后序序列和中序序列
D. 先序序列和后序序列

答案及解析:D
先序和后序能够确定根结点,但无法确定子树的顺序。中序可以实现左右子树的确定。因此,中序配合其他方法方法就可以唯一确定一棵二叉树。选项D错误。

【课堂互动12.1】二叉树的遍历

1. 在下列关于二叉树遍历的说法中,正确的是( )。
A. 若有一个结点是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定是该子树的前序遍历结果序列的最后一个结点
B. 若有一个结点是二叉树中某个子树的前序遍历结果序列的最后一个结点,则它一定是该子树的中序遍历结果序列的最后一个结点
C. 若有一个叶结点是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定是该子树的前序遍历结果序列的最后一个结点
D. 若有一个叶结点是二叉树中某个子树的前序遍历结果序列的最后一个结点,则它一定是该子树的中序遍历结果序列的最后一个结点

答案及解析: C

2. 在任何一棵二叉树中,若结点a有左孩子b、右孩子c,则在结点的先序序列、中序序列、后序序列中,( )。
A. 结点 b 一定在结点 a 的前面
B. 结点 a 一定在结点 c 的前面
C. 结点 b 一定在结点 c 的前面
D. 结点 a 一定在结点 b 的前面

答案及解析:C
先序遍历的顺序是根左右,中序遍历的顺序是左根右,后序遍历的顺序是左右根。因此,无论使用哪种遍历方式,左孩子一定在右孩子前面,即结点b始终在结点c前面。

3. 设 n, m 为一棵二叉树上的两个结点,在后序遍历时,n 在 m 前的条件是( )
A. n 在 m 右方
B. n 是 m 祖先
C. n 在 m 左方
D. n 是 m 子孙

答案及解析:D
后序遍历的顺序是左右根,因此有如下几种情况:

  1. n和m分别属于根的不同子树,则n必然在m的前方;
  2. n和m属于根的相同子树,则当n是m的子孙时,n必然在m的前方;
  3. n和m属于根的相同子树,并且n和m在同一层时,n也在m的前方。
    在这三种情况中,1和3都有比较强的前提。对于第2种情况,当n是m的子孙时,已经隐含了n和m在相同的子树,因此这种情况是必然的。所以,正确答案为D。

4. 在二叉树中有两个结点 m 和 n,若 m 是 n 的祖先,则使用( )可以找到从 m 到 n 的路径。
A. 先序遍历
B. 中序遍历
C. 后序遍历
D. 层次遍历

答案及解析:C
在使用后序遍历中,必须要保证左子树和右子树中的所有结点都已经被访问完才能访问根节点,因此在后序遍历的非递归算法中,从根节点开始,先将其入栈,然后沿着其左子树一直往下搜索,直到没有左子树为止,开始对右子树进行搜索并入栈,直到右子树也被全部遍历完并入栈。在这个过程中,对于每个结点的左子树来说,因为已经完成了三次访问,因此已经实现了出栈。所以对于堆栈中的某个结点p,从栈顶到栈底,刚好是p的每一个祖先结点。也就是说,从栈顶到栈底依次是结点p的父结点的父结点。。。,也就是刚好可以找到从m到n的路径。图🏷️Img_Lec1204Answer给出了这个过程的一个例子。


5.【2017统考真题】某二叉树的树形如图所示,其后序序列为e,a,c,b,d,g,f,树中与结点 a 同层的结点是( )。
🏷️Img_Lec1213

A. c
B. d
c. f
D. g

答案及解析:B
求解此题时,建议为二叉树预标一个编号,然后按照后序遍历方法生成后序序列,最后再将自编号序列与题目给出的序列进行对比,很容易得到正确的选项。此处,我们使用数字1-7进行编号,可获得后序序列6427531。结点a与结点4相对于,因此和a处于同层的,也和结点4处于同一层,即结点5(结点d)。
🏷️Img_Lec1213Answer


【课堂互动12.2】二叉树遍历的相关性质

1. 前序为 A, B, C,后序为 C, B, A 的二叉树共有( )。
A. 1棵
B. 2棵
C. 3棵
D. 4棵

答案及解析:D

  1. 前序为ABC,后序为CBA,说明A是根,BC是分支或者叶子。
  2. 在先序遍历中,最先访问的是根结点,因此当B在C的前面时,要么B在C的左边,要么B是C的祖先。
  3. 在后序遍历中,最后访问的是根结点,因此当C在B的前面时,要么C在B的左边,要么B是C的祖先。

综上,满足条件的只有一种情况,即B是C的祖先。当B是C的祖先时,总共有4种情况:B是A的左子树,C是B的左子树或者右子树;B是A的右子树,C是B的左子树或者右子树。即四棵单支树。

2. 设结点 X 和 Y 是二叉树中任意的两个结点。在该二叉树的先序遍历序列中 X 在 Y 之前,而在其后序遍历序列中 X 在 Y 之后,则 X 和 Y 的关系是( )。
A. X 是 Y 的左兄弟
B. X 是 Y 的右兄弟
C. X 是 Y 的祖先
D. X 是 Y 的后裔

答案及解析:C
在先序遍历和后序遍历中,同一层的左孩子始终先于右孩子,因此如果两种遍历的顺序正好相反,必然不存在任何一个结点同时包含左、右孩子,也就是说二叉树是一棵每层只有一个结点的单支树,即X和Y是祖孙关系。此题的先序序列中,X在Y的前面,因此X必然是Y的祖先。

3. 已知一棵二叉树的后序序列为 DABEC,中序序列为 DEBAC,则先序序列为( )。
A. ACBED
B. DECAB
C. DEABC
D. CEDBA

答案及解析:D
根据后序序列与中序序列可构造出一棵唯一的二叉树,如图 🏷️Img_Lec1205 所示。由该图可得到先序序列为CEDBA,选项D正确。


4. 已知一棵二叉树的先序遍历结果为 ABCDEF,中序序列为 CBAEDF,则后序遍历的结果为( )。
A. CBEFDA
B. FEDCBA
C. CBEDFA
D. 不确定

答案及解析:A
根据先序遍历与中序序列可构造出一棵唯一的二叉树,如图 🏷️Img_Lec1206 所示。由该图可得到先序序列为CBEFDA,选项A正确。


5. 已知一棵二叉树的层次序列为 ABCDEF,中序序列为 BADCFE,则先序序列为( )。
A. ACBEDF
B. ABCDEF
C. BDFECA
D. FCEDBA

答案及解析:B
根据层次序列与中序序列可构造出一棵唯一的二叉树,如图 🏷️Img_Lec1207 所示。由该图可得到先序序列为ABCDEF,选项B正确。


6. 【2009统考真题】给定二叉树如下图所示。设 N 代表二叉树的根,L代表根结点的左子树, R代表根结点的右子树。若遍历后的结点序列是3175624,则其遍历方式是( )。
🏷️Img_Lec1210

A. LRN
B. NRL
C. RLN
D. RNL

答案及解析:D
本题非二叉树遍历的三种基本方法,而是考察是否掌握遍历的基本思想。根据遍历序列3175624,可知根结点1是在中间被访问的,而对右子树的访问先于左子树,因此其遍历方式应该是右中左,即RNL。

【课堂互动12.3】树和森林的遍历

1.【2011统考真题】一棵二叉树的前序遍历序列和后序遍历序列分别为1,2,3,4和4,3,2,1,该二叉树的中序遍历序列不会是( )。
A. 1,2,3,4
B. 2,3,4,1
C. 3,2,4,1
D. 4,3,2,1

答案及解析:C
前序序列为根左右,后序为左右根,根据题意前序序列和后序序列刚好相反,说明二叉树每层只能有一个结点,即只能有左孩子或右孩子。因此,在中序遍历中,根结点只能在队首或队尾,并且每一个子树的根结点的后继结点也只能在队首或者队尾。根据这个规则,选项ABD都是正确的,错误的只有选项C。

2.【2012统考真题】若一棵二叉树的前序遍历序列为a,e,b,d,c,后序遍历序列为b,c,d,e,a,则根结点的孩子结点( )。
A. 只有e
B. 有e、b
C. 有e、c
D. 无法确定

答案及解析:A
根据前序序列和后序序列不能唯一确定一棵二叉树,但若前序序列和后序序列存在刚好逆序的部分,则可以判定a必然是e的祖先,且e是a的长子。此时,若按照前序假设,eb分别是a的左右子树,则后序的后三位应该是eba,显然不符合,因此选项B是错误的。类似的,若按照后序假设,则有de是a的左右子树,这又与e是a的左子树违背,因此选项C也是错误的。因此,bdc只能是e的子孙,即e是a的唯一孩子。所以只有选项A是正确的,选项D自然也就是 错误的。

3. 若 T1T_1 是由有序树 TT 转换而来的二叉树,则 TT 中结点的后根序列就是 T1T_1 中结点的( )序列。
A. 先序
B. 中序
C. 后序
D. 层序

答案及解析:B
树的先根遍历与二叉树和森林的先序遍历是等价的;树的后根遍历与森林和二叉树的中序遍历是等价的。此外,有兴趣的同学可以尝试绘制一个三结点的的树(A是根,左孩子B,右孩子C),此时后根遍历的顺序是BCA。当我们将其按照左孩子右兄弟的原则转换成二叉树的时候,A还是根节点,B是A的左孩子,C是B的右孩子。此时,遍历顺序BCA刚好是二叉树的中序遍历。

4. 某二叉树结点的中序序列为 BDAECF,后序序列为DBEFCA,则该二叉树对应的森林包括( )棵树。 🏷️Img_Lec1201
A. 1
B. 2
C. 3
D. 4

答案及解析:C

  1. 根据中序序列和后序序列可以确定一棵唯一的二叉树(左图)。在后序遍历中,最后一个结点是根结点;在中序序列中,根结点左边的元素是左子树,右边的元素是右子树,以此类推。
  2. 将该二叉树按照“左孩子右兄弟”的规则,可以转换成一个森林,该森林包含3棵树。蓝线为添加线,红色为删除线。


5.【2020统考真题】已知森林F及与之对应的二叉树T,若F的先根遍历序列是 a, b, c, d, e, f,后根遍历序列是 b, a, d, f, e, c,则T的后序遍历序列是( ) 🏷️Img_Lec1202
A. b, a, d, f, e, c
B. b, d, f, e, c, a
C. b, f, e, d, c, a
D. f, e, d, c, b, a

答案及解析:C
一、1. 森林的先根对应于二叉树的先序遍历;2. 后根遍历对应于二叉树的中序遍历。
二、如图所示:首先根据先序,可确定根结点为a;根据中序确定b为a的左子树,dfec为a的右子树;再根据先序确定c为dfec的根;根据中序确定dfe为c的左子树;再根据先序确定d为def的根;再根据中序确定fe为d的右子树;再根据先序确定e为ef的根;最后根据中序确定f为e的左子树。
三、对生成二叉树进行后序遍历可得序列:bfedca。


【课堂互动12.4】线索二叉树

1.【2010统考真题】下列线索二叉树中(用虚线表示线索),符合后序线索树定义的是( )
🏷️Img_Lec1211

答案及解析:D
本题四个结点的后序序列为:dbca。结点d没有左右子树,因此它的左指针应指向前驱Null,右指针应指向其后继结点c。此时唯有选项D正确。
为了进一步验证其他结点的正确性,我们列出bcd的线索。结点b没有左孩子,因此其左指针指向前驱,即结点d;结点c没有左右孩子,因此其左指针指向前驱结点b,右指针指向后继结点a;结点a左右孩子齐全,因此不包含线索指针。不难发现,选项D中结点abc的线索都是正确的。

2.【2013统考真题】若X是后序线索二叉树中的叶结点,且X存在左兄弟结点Y,则X的右线索指向的是( )。
A. X的父结点
B. 以Y为根的子树的最左下结点
C. X的左兄弟结点Y
D. 以Y为根的子树的最右下结点

答案及解析:A
若X存在左兄弟Y,则说明X, Y分别是某结点R的左右子树。按照后序遍历的规则,右子树访问完应该访问根结点。因此,若X的线索存在,则应指向其父结点。类似地,其左线索指向的则结点R的左孩子,即结点Y。

3.【2014统考真题】若对下图所示的二叉树进行中序线索化,则结点X的左、右线索指向的结点分别是( )。
🏷️Img_Lec1212

A. e, c
B. e, a
C. d, c
D. b, a

答案及解析:D
在中序遍历中,结点X的前驱和后继分别是B和A,因此当X没有左右孩子时,其左右线索分别指向结点B和A,即选项D。在此题中,整个二叉树中序遍历序列为DFBXAC。

4. n个结点的线索二叉树上含有的线索数为()。
A. 2n
B. n - 1
C. n + 1
D. n

答案及解析:C
本题考察的线索树,实际上等价于考察结点为n的二叉树有多少个空指针域。对于有n个结点的二叉树,共有指针域2n个。其中,除根结点外,每个结点都被一个指针指向,因此刚好使用了n-1个指针域。在剩余的链域中建立线索,共2n-(n-1) = n+1个线索,其中最后一个结点的线索指向null。

5. 二叉树在线索化后,仍不能有效求解的问题是( )。
A. 先序线索二叉树中求先序后继
B. 中序线索二叉树中求中序后继
C. 中序线索二叉树中求中序前驱
D. 后序线索二叉树中求后序后继

答案及解析:D
判断结点线索化后是否能解决遍历问题的关键是看其左右指针是否会与前驱、后续结点相冲突。当左/右结点存在的时候,其前驱/后继应该也正好是左/右结点;当左/右孩子不存的时候,其前驱/后继则指向真实的直接前驱/后继。如果,左/右孩子存在,但其真实的前驱/后继并非是左/右孩子(例如是双亲),则无法正常访问。

6. 若 X 是二叉中序线索树中一个有左孩子的结点,且 X 不为根,则 X 的前驱为( )
A. X的双亲
B. X的右子树中最左的结点
C. X的左子树中最右的结点
D. X的左子树中最右的叶结点

答案及解析:C
在二叉中序线索树中,若某结点若有左孩子,则按照中序“左根右”的顺序,该结点的前驱结点为左子树中最右的一个结点。注意,并不一定是最右叶结点。例如,当最右的结点只包含一个左孩子而没有右孩子,此时最后访问的是根结点,而不是右孩子。因此,选项C正确。图 🏷️Img_Lec1208 给出一个例子。


【扩展练习12】

1. 若二叉树中结点的先序序列是...a...b...,中序序列是...b...a...,则( )。
A. 结点 a 和结点 b 分别在某结点的左子树和右子树中
B. 结点 b 在结点 a 的右子树中
C. 结点 b 在结点 a 的左子树中
D. 结点 a 和结点 b 分别在某结点的两棵非空子树中

答案及解析:C
在先序遍历中,先访问根,再访问左右子树,因此确定a是根,b和c是a的孩子或子孙。中序遍历中,先左子树再根结点,因为b在a的前面,所以,b必然在a的左子树中。选项C正确。

2. 一棵二叉树的前序遍历序列为1234567,它的中序遍历序列可能是( )。
A. 3124567
B. 1234567
C. 4135627
D. 1463572

答案及解析:B

3. 某二叉树的先序序列和后序序列正好相反,则该二叉树一定是( )。
A. 空或只有一个结点
B. 高度等于其结点数
C. 任意一个结点无左孩子
D. 任意一个结点无右孩子

答案及解析:B
非空二叉树的先序序列和后序序列相反,即“根左右”与“左右根”顺序相反,因此树只有根结点,或根结点只有左子树或右子树,以此类推,其子树具有同样的性质,任意结点只有一个孩子,才能满足先序序列和后序序列正好相反。树形应为一个长链,因此选择选项B。

4. 在二叉树的前序序列、中序序列和后序序列中,所有叶结点的先后顺序( )。
A. 都不相同
B. 完全相同
C. 前序和中序相同,而与后序不同
D. 中序和后序相同,二与前序不同

答案及解析:B
在二叉树的各种遍历方式中,遍历结点的顺序是完全相同。即从根开始,顺着左子树一直走到底,然后再逐渐往右访问,整个路径可以看成是一个树的外包曲线。因此,对于叶结点来说,整体上都是从左往右访问,顺序完成一致。不同的是对于根的访问输出,先序是第一次访问时输出,中序第二次访问时输出,后序是第三次访问时输出。因此,选项B正确。

5. 对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左、右孩子中,其左孩子的编号小于其右孩子的编号,可采用( )次序的遍历实现编号。
A. 先序遍历
B. 中序遍历
C. 后序遍历
D. 层次遍历

答案及解析:C
从1开始编号,左孩子编号小于右孩子意味着,编号越大的访问顺序越靠后,因为在所有遍历方法中,左孩子始终早于右孩子访问。每个子树的根结点编号大于左、右孩子,说明根结点时最后访问的。因此满足左右根的顺序,即后序遍历,选项C正确。

6.【2015统考真题】先序序列为a,b,c,d的不同二叉树的个数是( )。
A. 13
B. 14
C. 15
D. 16

答案及解析:B
先序遍历和中序遍历的过程可以理解为第一次访问结点时进行入栈,第二次访问结点时进行出栈。此时,刚好可以唯一确定一个棵二叉树。因此,对于包含n个结点的先序序列,它总共包含 1n+1C2nn\frac{1}{n+1}C^n_{2n} 种出栈方法,即 14+1C84=14\frac{1}{4+1}C^4_8 = 14。此题的标准描述不易理解,考试时可尝试进行穷举法,绘制出这个先序序列的二叉树。

7.【2022统考真题】若结点p与q在二叉树T的中序遍历序列中相邻,且p在q之前,则下列p与q的关系中,不可能的是( )。
I. q是p的双亲
II. q是p的右孩子
Ⅲ. q是p的右兄弟
IV. q是p的双亲的双亲

A. 仅I
B. 仅Ⅲ
C. 仅Ⅱ、Ⅲ
D. 仅Ⅱ、IV

答案及解析:B

8. 判断线索二叉树中*p结点有右孩子结点的条件是( )
A. p != null
B. p->rchild != null
C. p->rtag == 0
D. p->rtag == 1

答案及解析:C
线索二叉树中用ltag/rtag来标识结点的左/右指针域是否为线索,其值为1时,对应指针域为线索,其值为0时,对应指针域为左/右孩子。

9. 一棵左子树为空的二叉树在先序线索化后,其中空的链域的个数是( )。
A. 不确定
B. 0个
C. 1个
D. 2个

答案及解析:D
对左子树为空的二叉树进行先序线索化,根结点的左子树为空并且也没有前驱结点(先遍历根结点),先序遍历的最后一个元素为叶结点,左、右子树均为空且有前驱无后继结点,故线索化后,树中空链域有2个。

10. 在线索二叉树中,下列说法不正确的是( )。
A. 在中序线索树中,若某结点有右孩子,则其后继结点是它的右子树的最左下结点
B. 在中序线索树中,若某结点有左孩子,则其前驱结点是它的左子树的最右下结点
C. 线索二叉树是利用二叉树的 n+1 个空指针来存放结点的前驱和后继信息的
D. 每个结点通过线索都可以直接找到它的前驱和后继

答案及解析:D
中序遍历的顺序是左中右,当某结点有右孩子时,后继线索指向的右子树中第一个被访问的结点,即最左下的结点,故选项A正确;当某结点有左孩子时,前驱线索指向左子树的最后一个被访问的结点,即最右下的结点,故选项B正确。选项C是定义,也正确。然而,对于每个结点来说,二叉链中没有指向父结点的指针,所以无论是先序还是后序查找结点的父结点都很不方便。

11.( )的遍历仍需要栈的支持。
A. 前序线索树
B. 中序线索树
C. 后序线索树
D. 所有线索树

答案及解析:C
后序线索树遍历时,最后访问根结点,若从右孩子x返回访问父结点,则由于结点x的右孩子不一定为空(右指针无法指向其后继),因此通过指针可能无法遍历整棵树。如下图所示,结点中的数字表示遍历的顺序,图(c)中结点6的右指针指向其右孩子5,而不是指向其后序后继结点7,因此后序遍历还需要栈的支持,而图(a)和图(b)均可遍历。🏷️Img_Lec1209 给出一个例子。


第12讲 树的遍历 课堂互动 隐藏答案 | 返回首页