二叉树及其三种序的递归实现
// 递归序的解释
// 用递归实现二叉树的三序遍历
public class BinaryTreeTraversalRecursion {
public static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int v) {
val = v;
}
}
// 递归基本样子,用来理解递归序
public static void f(TreeNode head) {
if (head == null) {
return;
}
// 1
f(head.left);
// 2
f(head.right);
// 3
}
// 先序打印所有节点,递归版
public static void preOrder(TreeNode head) {
if (head == null) {
return;
}
System.out.print(head.val + " ");
preOrder(head.left);
preOrder(head.right);
}
// 中序打印所有节点,递归版
public static void inOrder(TreeNode head) {
if (head == null) {
return;
}
inOrder(head.left);
System.out.print(head.val + " ");
inOrder(head.right);
}
// 后序打印所有节点,递归版
public static void posOrder(TreeNode head) {
if (head == null) {
return;
}
posOrder(head.left);
posOrder(head.right);
System.out.print(head.val + " ");
}
public static void main(String[] args) {
TreeNode head = new TreeNode(1);
head.left = new TreeNode(2);
head.right = new TreeNode(3);
head.left.left = new TreeNode(4);
head.left.right = new TreeNode(5);
head.right.left = new TreeNode(6);
head.right.right = new TreeNode(7);
preOrder(head);
System.out.println();
System.out.println("先序遍历递归版");
inOrder(head);
System.out.println();
System.out.println("中序遍历递归版");
posOrder(head);
System.out.println();
System.out.println("后序遍历递归版");
}
}
这段代码是用递归方式实现二叉树的三种遍历,逐层解释下它的结构、原理和运行效果
🔧 结构一览
类定义:
public static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
}
-
一个标准的二叉树节点,包含值、左子节点、右子节点。
-
构造函数赋值
val。
🧠 核心理解:递归三序遍历
📌 什么是三序遍历?
对于每个节点,三种遍历的区别是“什么时候访问当前节点(打印)”:
| 遍历顺序 | 访问顺序 | 打印位置(代码) |
|---|---|---|
| 前序 | 当前 ➜ 左 ➜ 右 | 在递归前 |
| 中序 | 左 ➜ 当前 ➜ 右 | 在中间 |
| 后序 | 左 ➜ 右 ➜ 当前 | 在递归后 |
1️⃣ 前序遍历 preOrder(TreeNode head)
System.out.print(head.val + " "); // 先打印当前
preOrder(head.left);
preOrder(head.right);
执行顺序(节点编号):
1 2 4 5 3 6 7
2️⃣ 中序遍历 inOrder(TreeNode head)
inOrder(head.left);
System.out.print(head.val + " "); // 中间打印
inOrder(head.right);
执行顺序:
4 2 5 1 6 3 7
3️⃣ 后序遍历 posOrder(TreeNode head)
posOrder(head.left);
posOrder(head.right);
System.out.print(head.val + " "); // 最后打印
执行顺序:
4 5 2 6 7 3 1
🌱 f(TreeNode head) 函数是干嘛的?
public static void f(TreeNode head) {
if (head == null) {
return;
}
// 1
f(head.left);
// 2
f(head.right);
// 3
}
这是一个递归序模板,不打印任何东西,但用于理解递归的调用流程。
想象如下调用过程:
f(1)
├─ f(2)
│ ├─ f(4)
│ └─ f(5)
└─ f(3)
├─ f(6)
└─ f(7)
你可以在注释 //1、//2、//3 处打印,来理解“递归进入、左右递归、递归退出”的时机。
🌳 创建的二叉树结构:
主函数中创建的树结构如下:
1
/ \
2 3
/ \ / \
4 5 6 7
✅ 程序输出
运行输出如下:
1 2 4 5 3 6 7
先序遍历递归版
4 2 5 1 6 3 7
中序遍历递归版
4 5 2 6 7 3 1
后序遍历递归版
非常完美,对应每种遍历顺序。
🎯 总结
-
三序遍历的唯一区别在于访问当前节点的时机。
-
本质是二叉树递归调用:对当前节点的左右子树分别递归处理。
-
用递归可以轻松表达结构性数据的访问顺序。
-
熟练掌握是为了后面学习非递归写法、栈模拟打基础。

浙公网安备 33010602011771号