算法札记:二叉树前序、中序、后序遍历及对应序列重要性质

一、三种遍历的定义

二叉树遍历是一个递归过程:先处理根节点,再分别处理左、右子树。根据"根节点"被访问的位置不同,有三种深度优先遍历3

  • 前序遍历 :根 → 左子树 → 右子树

    先访问根节点,再前序遍历左子树,最后前序遍历右子树。

  • 中序遍历 :左子树 → 根 → 右子树

    先中序遍历左子树,再访问根节点,最后中序遍历右子树。

  • 后序遍历 :左子树 → 右子树 → 根

    先后序遍历左子树,再后序遍历右子树,最后访问根节点。

递归和非递归实现得到的序列完全一致,非递归只是用显式栈模拟递归过程。

二、示例

例如二叉树:

复制代码

text

复制代码
      1
     / \
    2   3
   / \   \
  4   5   6
  • 前序序列:1,2,4,5,3,61,2,4,5,3,6

  • 中序序列:4,2,5,1,3,64,2,5,1,3,6

  • 后序序列:4,5,2,6,3,14,5,2,6,3,1

三、遍历序列的重要性质

1. 子树在序列中是连续区间

以任意节点为根的子树,在三种序列中都对应一个连续区间。并且在这个区间内:

  • 前序序列中,根节点在区间最前面;

  • 中序序列中,根节点在左子树区间和右子树区间之间;

  • 后序序列中,根节点在区间最后面。

这是"由遍历序列还原二叉树"的核心基础。

2. 根节点的定位

  • 前序序列的第一个元素一定是整棵树的根节点。

  • 后序序列的最后一个元素一定是整棵树的根节点。

  • 中序序列中,根节点左边的元素全部来自左子树,右边的元素全部来自右子树。

因此,只要有了"中序 + 前序"或"中序 + 后序",就能确定根,并区分左右子树。

3. 二叉树还原的唯一性

  • 前序序列 + 中序序列:能唯一确定一棵二叉树。

  • 后序序列 + 中序序列:能唯一确定一棵二叉树。

  • 前序序列 + 后序序列:一般不能唯一确定二叉树。

反例:树 A 是根节点 1 只有左孩子 2;树 B 是根节点 1 只有右孩子 2。

树 A 和树 B 的前序序列都是 1,21,2,后序序列都是 2,12,1,但它们是两棵不同的二叉树。

所以,已知前序和中序可以唯一推出后序;已知后序和中序可以唯一推出前序;但只知道前序和后序,无法唯一确定中序遍历序列。

若额外限制为严格二叉树 (每个内部节点都有左右两个孩子),则前序 + 后序可以唯一还原二叉树1

4. 与二叉搜索树的关系

对于二叉搜索树(BST):

  • 中序遍历序列一定按关键字递增排列

  • 因为中序序列隐含已知,所以仅凭前序序列或后序序列也能唯一重建这棵 BST。

5. 表达式树中的应用

表达式树的前序、中序、后序遍历分别对应:

  • 前序序列:前缀表达式;

  • 中序序列:中缀表达式;

  • 后序序列:后缀表达式,也就是逆波兰式,用栈求值非常方便。

6. 其他性质

  • 三种深度优先遍历中,叶子节点的从左到右相对顺序相同

  • 三种遍历的时间复杂度都是 O(n)O(n),其中 nn 是节点数;递归栈空间为 O(h)O(h),hh 是树高,最坏情况下为 O(n)O(n)。

四、由序列还原二叉树的方法

前序 + 中序还原:

  1. 前序序列的第一个元素是根节点;

  2. 在中序序列中找到根节点,根左侧长度为 LL;

  3. 前序序列中,根节点之后的前 LL 个元素属于左子树,剩余元素属于右子树;

  4. 递归处理左右子树即可1 2

后序 + 中序还原:

  1. 后序序列的最后一个元素是根节点;

  2. 在中序序列中找到根节点,根左侧长度为 LL;

  3. 后序序列中,前 LL 个元素属于左子树,接下来若干元素属于右子树,最后是根节点;

  4. 递归处理左右子树即可1 2

相关推荐
Delite8021 小时前
微库仑氧化法硫氯检测:油品分析中测量误差的控制要点
算法
如此这般英俊1 小时前
手搓Claude Code-第十章 system_prompt
数据结构·人工智能·python·语言模型·自然语言处理·prompt
宵时待雨1 小时前
优选算法专题12:队列
算法·leetcode·职场和发展
tianyu2341 小时前
双指针循环匹配金额——打款记录与账单的自动对账算法
java·算法·双指针循环·匹配金额
旖旎夜光2 小时前
LeetCode 738:单调递增的数字(贪心算法) —— 题解
数据结构·c++·算法·leetcode·贪心算法
青山木2 小时前
Hot 100 --- 搜索二维矩阵
java·算法·leetcode·矩阵
旖旎夜光2 小时前
LeetCode 1262:可被三整除的最大和 (贪心算法)—— 题解
数据结构·c++·算法·leetcode·贪心算法
心运软件2 小时前
基于机器学习的智能邮件分类系统:从数据采集到模型部署全流程实战
人工智能·python·算法·随机森林·机器学习·分类·scikit-learn
影视飓风TIM3 小时前
C++ STL 完整入门笔记[9]:C++ 仿函数、priority_queue与STL算法底层笔记
数据结构·c++·笔记