故事:小明的寻宝之旅之二叉树的前中后遍历

71 阅读3分钟

背景
小明收到一张神秘的岛屿地图,岛上藏着三箱宝藏:金宝箱(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)排序
后序左 → 右 → 根删除二叉树、资源释放

动画理解(想象画面)

  1. 前序遍历
    小明站在山顶,先拿走金宝箱,然后向左走(东海岸),再向右走(西海岸)。
    路径:山顶 → 东海岸 → 西海岸。

  2. 中序遍历
    小明先向左走到东海岸,再回到山顶,最后向右走到西海岸。
    路径:东海岸 → 山顶 → 西海岸。

  3. 后序遍历
    小明先向左走到东海岸,再向右走到西海岸,最后回到山顶。
    路径:东海岸 → 西海岸 → 山顶。

通过这个故事和代码,你可以记住:前序先访问根,中序中间访问根,后序最后访问根。这三种遍历方式本质上是递归访问左右子树的顺序不同。如果有任何疑问,欢迎随时提问! 😊