当前位置: 首页 > news >正文

二叉树的前序、中序和后序遍历:详解与实现

1. 前序遍历(Pre-order Traversal)

1.1 定义

前序遍历的顺序是:先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树

1.2 访问顺序

对于任意节点:

  1. 访问根节点。

  2. 递归遍历左子树。

  3. 递归遍历右子树。

1.3 示例

假设我们有以下二叉树:

        A/ \B   C/ \   \D   E   F

前序遍历的结果是:A -> B -> D -> E -> C -> F

1.4 递归实现

class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;this.left = null;this.right = null;}
}public class BinaryTree {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}res.add(root.val); // 访问根节点res.addAll(preorderTraversal(root.left)); // 递归遍历左子树res.addAll(preorderTraversal(root.right)); // 递归遍历右子树return res;}
}

1.5 应用场景

  • 构建表达式树:前序遍历可以生成表达式的前缀表达式。

  • 复制二叉树:通过前序遍历可以复制一个二叉树。

  • 序列化二叉树:前序遍历可以用于将二叉树序列化为一个字符串。

2. 中序遍历(In-order Traversal)

2.1 定义

中序遍历的顺序是:先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树

2.2 访问顺序

对于任意节点:

  1. 递归遍历左子树。

  2. 访问根节点。

  3. 递归遍历右子树。

2.3 示例

假设我们有以下二叉树:

        A/ \B   C/ \   \D   E   F

中序遍历的结果是:D -> B -> E -> A -> C -> F

2.4 递归实现

public class BinaryTree {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}res.addAll(inorderTraversal(root.left)); // 递归遍历左子树res.add(root.val); // 访问根节点res.addAll(inorderTraversal(root.right)); // 递归遍历右子树return res;}
}

2.5 应用场景

  • 二叉搜索树(BST):中序遍历可以生成一个递增的有序序列。

  • 表达式树:中序遍历可以生成表达式的中缀表达式。

3. 后序遍历(Post-order Traversal)

3.1 定义

后序遍历的顺序是:先递归地遍历左子树,然后递归地遍历右子树,最后访问根节点

3.2 访问顺序

对于任意节点:

  1. 递归遍历左子树。

  2. 递归遍历右子树。

  3. 访问根节点。

3.3 示例

假设我们有以下二叉树:

        A/ \B   C/ \   \D   E   F

后序遍历的结果是:D -> E -> B -> F -> C -> A

3.4 递归实现

public class BinaryTree {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}res.addAll(postorderTraversal(root.left)); // 递归遍历左子树res.addAll(postorderTraversal(root.right)); // 递归遍历右子树res.add(root.val); // 访问根节点return res;}
}

3.5 应用场景

  • 删除二叉树:后序遍历可以确保在删除根节点之前先删除其子节点。

  • 表达式树:后序遍历可以生成表达式的后缀表达式。

4. 总结

遍历方式访问顺序应用场景
前序遍历根 -> 左 -> 右构建表达式树、复制二叉树、序列化二叉树
中序遍历左 -> 根 -> 右生成有序序列、表达式树的中缀表达式
后序遍历左 -> 右 -> 根删除二叉树、表达式树的后缀表达式

4.1 递归实现的通用模板

public class BinaryTree {public List<Integer> traversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}// 递归遍历左子树res.addAll(traversal(root.left));// 访问根节点(根据遍历方式调整位置)res.add(root.val);// 递归遍历右子树res.addAll(traversal(root.right));return res;}
}
http://www.xdnf.cn/news/172765.html

相关文章:

  • 非计算机专业如何利用AI开展跨学科和交叉研究
  • 智能硬件行业售后服务管理:提升客户体验的关键所在
  • Java:网络编程
  • CesiumEarth更新至1.14.0版本,重新设计了图层设置页面,优化了许多界面交互问题
  • K8S Pod 常见数据存储方案
  • Lua 第12部分 日期和时间
  • PH热榜 | 2025-04-27
  • HTML倒数
  • java 类的实例化过程,其中的相关顺序 包括有继承的子类等复杂情况,静态成员变量的初始化顺序,这其中jvm在干什么
  • xe-upload上传文件插件
  • WPF常用技巧汇总 - Part 2
  • Qt项目全局设置UTF-8编码方法(MSVS编译中文报错解决办法)
  • 新能源汽车运动控制器核心芯片选型与优化:MCU、DCDC与CANFD协同设计
  • 设计一个新能源汽车控制系统开发框架,并提供一个符合ISO 26262标准的模块化设计方案。
  • Java高频常用工具包汇总
  • [特殊字符]实战:使用 Canal + MQ + ES + Redis + XXL-Job 打造高性能地理抢单系统
  • Spark Mllib 机器学习
  • 第二章,网络类型及数据链路层协议
  • SMART:大模型在关键推理步骤辅导小模型,在保持高推理效率的同时,显著提升小模型的推理能力!!
  • python合并一个word段落中的run
  • 决策树相关案例
  • 【Node.js 】在Windows 下搭建适配 DPlayer 的轻量(简陋)级弹幕后端服务
  • Linux系统之设置开机启动运行桌面环境
  • 力扣hot100_子串_python版本
  • Nginx配置文件介绍
  • 机器学习day2-seaborn绘图练习
  • 数模学习:二,MATLAB的基本语法使用
  • 跨专业自学AI人工智能学习路线图(2025版)
  • Android完整开发环境搭建/Studio安装/NDK/本地Gradle下载配置/创建AVD/运行一个Android项目/常用插件
  • 金融数据分析(Python)个人学习笔记(13):自然语言处理