二叉树遍历序列的性质
基本定义
- 前序遍历(Preorder):根节点 → 左子树 → 右子树
- 中序遍历(Inorder):左子树 → 根节点 → 右子树
- 后序遍历(Postorder):左子树 → 右子树 → 根节点
单个序列的重要性质
前序遍历性质
- 序列的第一个节点必定是根节点
- 任意节点在序列中出现在其所有子孙节点之前
- 若某节点是其父节点的左子节点,它在序列中紧跟在其父节点之后
中序遍历性质
- 对于二叉搜索树 (BST),中序遍历得到的是递增序列
- 任意节点的左子树中所有节点在该节点前面,右子树中所有节点在该节点后面
- 单独一个中序遍历序列不能唯一确定一棵二叉树
后序遍历性质
- 序列的最后一个节点必定是根节点
- 任意节点在序列中出现在其所有子孙节点之后
- 适合用于释放/删除树,因为总是先处理子节点再处理父节点
序列组合的性质
前序 + 中序组合
二叉树的前序遍历和中序遍历对应入栈和出栈次序,也就是说,已知前序序列,那么可能的二叉树棵数就等于其出栈顺序个数 卡特兰数(Catalan number)
- 可以唯一确定一棵二叉树
- 前序确定根节点,中序可分割左右子树
- 树的重构算法基础:递归地识别子树的根节点和范围
后序 + 中序组合
- 可以唯一确定一棵二叉树
- 后序的最后一个元素是根节点,中序可分割左右子树
前序 + 后序组合
- 对于一般二叉树,不能唯一确定树结构
- 对于满二叉树(每个非叶节点都有两个子节点),可以唯一确定
其他特性
- 三种遍历的序列长度都等于树中节点总数
- 叶子节点在三种遍历序列中的相对顺序相同
- 前序遍历的第一个节点和后序遍历的最后一个节点相同(都是根节点)
- 知道一棵树的形状,任意两种遍历序列可推导出第三种
二叉树遍历序列编号的性质
前序遍历
在前序遍历(根 - 左 - 右)中,假设某节点编号为 ,那么:
- 根节点性质:整棵树的根节点编号始终为 1
- 左右子树编号区间:
- 左子树的所有节点编号形成连续区间:(其中 是左子树节点数)
- 右子树的所有节点编号形成连续区间:(其中 是右子树节点数)
- 直接子节点性质:
- 左子节点的编号:(紧跟在父节点之后)
- 右子节点的编号:(左子树之后的第一个)
中序遍历
在中序遍历(左 - 根 - 右)中,假设某节点编号为 ,那么:
- 根节点性质:整棵树的根节点编号为 (其中 是左子树节点数)
- 左右子树编号区间:
- 左子树的所有节点编号形成连续区间:
- 右子树的所有节点编号形成连续区间:
- 直接子节点性质:
- 左子节点所在子树的最大编号为
- 右子节点所在子树的最小编号为
- 特殊性质:在二叉搜索树中,节点的中序编号恰好对应其值的大小顺序
后序遍历
在后序遍历(左 - 右 - 根)中,假设某节点编号为 ,那么:
- 根节点性质:整棵树的根节点编号等于节点总数
- 左右子树编号区间:
- 左子树的所有节点编号形成连续区间:
- 右子树的所有节点编号形成连续区间:
- 直接子节点性质:
- 右子节点的编号为 (紧邻父节点)
- 左子节点所在子树的最大编号为
- 特殊性质:任何节点的编号都大于其所有子孙节点的编号
通用性质
- 子树连续性:在任何遍历序列中,一棵子树的所有节点编号总是连续的
- 节点数关系:对任意节点,设其左子树节点数为 ,右子树节点数为 ,则以该节点为根的子树总节点数为
- 递归性质:以上性质对树中的每个子树都成立
二叉树序列相同的情况辨析
1. 两序列相同的情况
前序序列 = 中序序列:右斜树
A
\
B
\
C
\
D解释:当所有节点都没有左子树时,前序遍历 (根 - 左 - 右) 和中序遍历 (左 - 根 - 右) 会产生相同序列,因为 ” 左 ” 为空,使得两个遍历序列都变为 ” 根 - 右 “。
中序序列 = 后序序列:左斜树
A
/
B
/
C
/
D解释:当所有节点都没有右子树时,中序遍历 (左 - 根 - 右) 和后序遍历 (左 - 右 - 根) 会产生相同序列,因为 ” 右 ” 为空,使得两个遍历序列都变为 ” 左 - 根 “。
前序序列 = 后序序列:单节点树
A解释:只有当树只有一个节点时,前序和后序才会相同,因为此时没有左右子树,三种遍历都只有根节点。
2. 两序列相反的情况
前序序列与中序序列相反:左斜树
A
/
B
/
C
/
D解释:在左斜树中,前序是从根向下 (A→B→C→D),而中序是从叶向上 (D→C→B→A),它们正好相反。
中序序列与后序序列相反:右斜树
A
\
B
\
C
\
D解释:在右斜树中,中序是从上到下 (A→B→C→D),而后序是从下到上 (D→C→B→A),它们正好相反。
前序序列与后序序列相反:每个非叶子节点最多只有一个子节点
既可以是左斜树:
A
/
B
/
C
/
D也可以是右斜树:
A
\
B
\
C
\
D解释:
- 左斜树:前序 (A→B→C→D) 与后序 (D→C→B→A) 相反
- 右斜树:前序 (A→B→C→D) 与后序 (D→C→B→A) 相反
有转折的情况:
当二叉树既不是严格的左斜树也不是严格的右斜树,但仍满足前序与后序序列相反的条件时,树的形态可能为:
A
/
B
\
C
\
D分析:
- 前序遍历:A → B → C → D
- 后序遍历:D → C → B → A
- 序列仍然完全相反
一般规律: 前序序列与后序序列相反的充要条件是:二叉树中每个非叶子节点最多只有一个子节点。
具体包括:
- 左斜树:每个节点最多只有左子节点
- 右斜树:每个节点最多只有右子节点
- 混合单支树:每个节点最多只有一个子节点(可以是左子节点或右子节点)
数学证明: 设二叉树有 个节点,前序序列为 ,后序序列为 。
若 与 相反,则 对所有 成立。
由于前序遍历根节点最先访问,后序遍历根节点最后访问,所以 (根节点)。
对于任意非叶子节点,若其既有左子树又有右子树,则在前序遍历中,该节点后紧跟左子树的根节点;在后序遍历中,该节点前紧邻右子树的根节点。这会破坏序列相反的性质。
因此,每个非叶子节点最多只能有一个子节点。