背景:
小明收到一张神秘的岛屿地图,岛上藏着三箱宝藏:金宝箱(Gold)、银宝箱(Silver)和铜宝箱(Bronze)。地图上标记了三个地点,形成了一个树形结构:山顶(Root)、东海岸(East)和西海岸(West)。每个地点可能藏有宝箱,也可能有通往其他地点的线索。
地图结构:
-
山顶(Root):藏有金宝箱,并有两条线索指向东海岸和西海岸。
-
东海岸(East):藏有银宝箱,没有其他线索。
-
西海岸(West):藏有铜宝箱,没有其他线索。
这个地图可以用二叉树表示:
plaintext
山顶(Gold)
/ \
东海岸(Silver) 西海岸(Bronze)
三种寻宝策略(遍历方式)
1. 前序遍历(根 → 左 → 右)
故事:
小明来到山顶,先找到金宝箱(根节点)。然后按照线索先去东海岸,找到银宝箱(左子节点)。最后去西海岸,找到铜宝箱(右子节点)。
口诀:先挖根,再挖左,最后挖右。
Java 代码:
java
class TreeNode {
String treasure;
TreeNode left;
TreeNode right;
public TreeNode(String treasure) {
this.treasure = treasure;
}
}
public class BinaryTreeTraversal {
// 前序遍历:根 → 左 → 右
public static void preOrder(TreeNode node) {
if (node == null) return;
// 1. 访问根节点
System.out.print(node.treasure + " → "); // 输出:Gold → Silver → Bronze
// 2. 递归遍历左子树
preOrder(node.left);
// 3. 递归遍历右子树
preOrder(node.right);
}
public static void main(String[] args) {
// 构建二叉树
TreeNode root = new TreeNode("Gold");
root.left = new TreeNode("Silver");
root.right = new TreeNode("Bronze");
System.out.print("前序遍历结果:");
preOrder(root); // 输出:Gold → Silver → Bronze →
}
}
2. 中序遍历(左 → 根 → 右)
故事:
小明来到山顶,先按照线索去东海岸,找到银宝箱(左子节点)。回到山顶,找到金宝箱(根节点)。最后去西海岸,找到铜宝箱(右子节点)。
口诀:先挖左,再挖根,最后挖右。
Java 代码:
java
// 中序遍历:左 → 根 → 右
public static void inOrder(TreeNode node) {
if (node == null) return;
// 1. 递归遍历左子树
inOrder(node.left);
// 2. 访问根节点
System.out.print(node.treasure + " → "); // 输出:Silver → Gold → Bronze
// 3. 递归遍历右子树
inOrder(node.right);
}
// 在main方法中调用中序遍历
System.out.print("中序遍历结果:");
inOrder(root); // 输出:Silver → Gold → Bronze →
3. 后序遍历(左 → 右 → 根)
故事:
小明来到山顶,先按照线索去东海岸,找到银宝箱(左子节点)。再去西海岸,找到铜宝箱(右子节点)。最后回到山顶,找到金宝箱(根节点)。
口诀:先挖左,再挖右,最后挖根。
Java 代码:
java
// 后序遍历:左 → 右 → 根
public static void postOrder(TreeNode node) {
if (node == null) return;
// 1. 递归遍历左子树
postOrder(node.left);
// 2. 递归遍历右子树
postOrder(node.right);
// 3. 访问根节点
System.out.print(node.treasure + " → "); // 输出:Silver → Bronze → Gold
}
// 在main方法中调用后序遍历
System.out.print("后序遍历结果:");
postOrder(root); // 输出:Silver → Bronze → Gold →
总结:三种遍历方式对比
| 遍历方式 | 访问顺序 | 应用场景 |
|---|---|---|
| 前序 | 根 → 左 → 右 | 复制二叉树、表达式树求值 |
| 中序 | 左 → 根 → 右 | 二叉搜索树(BST)排序 |
| 后序 | 左 → 右 → 根 | 删除二叉树、资源释放 |
动画理解(想象画面)
-
前序遍历:
小明站在山顶,先拿走金宝箱,然后向左走(东海岸),再向右走(西海岸)。
路径:山顶 → 东海岸 → 西海岸。 -
中序遍历:
小明先向左走到东海岸,再回到山顶,最后向右走到西海岸。
路径:东海岸 → 山顶 → 西海岸。 -
后序遍历:
小明先向左走到东海岸,再向右走到西海岸,最后回到山顶。
路径:东海岸 → 西海岸 → 山顶。
通过这个故事和代码,你可以记住:前序先访问根,中序中间访问根,后序最后访问根。这三种遍历方式本质上是递归访问左右子树的顺序不同。如果有任何疑问,欢迎随时提问! 😊