当前位置: 首页 > 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;}
}

相关文章:

  • FastAPI系列06:FastAPI响应(Response)
  • 信号量函数
  • 计算机网络全栈精讲:从 TCP/UDP 原理到 Socket 编程与 HTTP 协议实战(含代码实现)
  • Matlab 报错:尝试将 SCRIPT vl_sift 作为函数执行:
  • Linux 【杂谈】基础知识(一)
  • 双目RealSense系统配置rs_camera.launch----实现D435i自制rosbag数据集到离线场景的slam建图
  • 贪心算法-860.柠檬水找零-力扣(LeetCode)
  • Linux系统编程:信号量Semaphore详解 (IPC)
  • vue3中ref在js中为什么需要.value才能获取/修改值?
  • C++:STL——list
  • 可以隐藏列的表格
  • 单片机 + 图像处理芯片 + TFT彩屏 复选框控件
  • Linux内核中的编译时安全防护:以网络协议栈控制块校验为例
  • 单片机之间的双向通信
  • terraform查看资源建的关联关系
  • 一、linux系统启动过程操作记录
  • 插入排序(直接插入排序、折半插入排序和希尔排序)
  • C++中析构函数
  • log4cpp进阶指南
  • LeetCode 每日一题 2025/4/21-2025/4/27
  • 江西省国资委原副主任李键主动向组织交代问题,接受审查调查
  • 我国将出台稳就业稳经济推动高质量发展若干举措,将根据形势变化及时出台增量储备政策
  • “五一”假期全国口岸日均出入境人员将达215万人次
  • 俄罗斯准备在没有先决条件的情况下与乌克兰进行谈判
  • 著名统计学家、北京工业大学应用数理学院首任院长王松桂逝世
  • 财政部部长蓝佛安:中国将采取更加积极有为的宏观政策