二叉树及其三种序的递归实现


// 递归序的解释
// 用递归实现二叉树的三序遍历
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 
后序遍历递归版

非常完美,对应每种遍历顺序。


🎯 总结

  • 三序遍历的唯一区别在于访问当前节点的时机

  • 本质是二叉树递归调用:对当前节点的左右子树分别递归处理。

  • 用递归可以轻松表达结构性数据的访问顺序。

  • 熟练掌握是为了后面学习非递归写法栈模拟打基础。


posted @ 2025-07-17 22:34  ji415  阅读(7)  评论(0)    收藏  举报