🌳探索二叉树的奇妙世界:从前序遍历开始我们的编程冒险🌲

22 阅读3分钟

在编程的世界里,有些概念听起来就像是从科幻小说中直接跳出来的。比如今天我们要聊的“二叉树”,这不仅仅是一种数据结构,它更像是一个神秘的迷宫,充满了挑战与乐趣。想象一下,你站在一个巨大的迷宫入口,前方有无数条路径等待着你去探索——这就是二叉树的魅力所在。🧐

“树是递归定义的,就像生活本身。”


🌲 什么是二叉树?💡

简单来说,二叉树是一棵“最多有两个孩子”的树形结构。它由以下几部分组成:

  • 根节点(Root) :整棵树的起点,只有一个。
  • 左子树右子树:每个节点最多有两个子节点,且顺序严格区分(不能交换!)
  • 叶子节点(Leaf) :没有孩子的节点,就像树梢上的树叶🍃。

⚠️ 注意:二叉树 ≠ 度为2的树!
比如一个节点只有左子树,也属于合法二叉树!

我们先来看一张图,直观感受一下树的结构👇:

9e87b737a5354c0cb38e92b51f7abbd1.png

👉 这就是一棵典型的树结构,蓝色的是内部节点,绿色的是叶子节点。根节点在最下面,往上延伸,像倒挂的树一样(因为计算机里的树是“倒着长”的 😂)。


🧱 二叉树的内存表示:用对象构建一棵树 💻

在 JavaScript 中,我们可以用 TreeNode 类来表示每个节点:

class TreeNode {
    constructor(val) {
        this.val = val;
        this.left = this.right = null;
    }
}

每个节点包含:

  • val:值(比如数字、字母)
  • left:指向左子节点的引用
  • right:指向右子节点的引用

来看看它在内存中的样子👇:

3f0a132002904769b3a1d22324b7dd0b.png

🧠 小知识:这种结构叫「链式存储」,和数组不同,它不连续,但更灵活!


🎯 二叉树的遍历:三种方式,三种人生观 🧭

遍历就是“走一遍树的所有节点”。根据访问根节点的时间不同,分为三种:

遍历方式访问顺序
前序遍历根 → 左 → 右
中序遍历左 → 根 → 右
后序遍历左 → 右 → 根

让我们以这棵树为例👇:

022a80f380c548438f7a19c8d25cbaf0.png

🔹 前序遍历(Preorder)

function preorder(root) {
    if (!root) return;
    console.log(root.val);       // 先打印自己
    preorder(root.left);         // 再去左子树
    preorder(root.right);        // 最后去右子树
}

✅ 输出:A → B → D → E → C → F
👉 适合用于复制树结构前缀表达式

🔹 中序遍历(Inorder)

function inorder(root) {
    if (!root) return;
    inorder(root.left);
    console.log(root.val);
    inorder(root.right);
}

✅ 输出:D → B → E → A → C → F
👉 如果是二叉搜索树,输出就是升序排列!超实用!

🔹 后序遍历(Postorder)

function postorder(root) {
    if (!root) return;
    postorder(root.left);
    postorder(root.right);
    console.log(root.val);
}

✅ 输出:D → E → B → F → C → A
👉 适合删除树计算表达式(后缀表达式)。


🚀 层序遍历:从上到下,从左到右 🌐

前面三种都是“深度优先”(DFS),而层序遍历是“广度优先”(BFS),用队列实现:

function levelOrder(root) {
    if (!root) return [];
    const result = [];
    const queue = [root];
    
    while (queue.length) {
        const node = queue.shift(); // FIFO
        result.push(node.val);
        if (node.left) queue.push(node.left);
        if (node.right) queue.push(node.right);
    }
    return result;
}

✅ 输出:[A, B, C, D, E, F]
👉 就像坐热气球飞过森林,一层一层看过去,视野开阔!


🤔 思考时间:为什么需要这么多遍历?

你以为只是“打印顺序”不一样?错!它们代表了不同的思维方式

  • 前序:我先认识自己,再认识我的朋友。
  • 中序:我左边的人说了啥,我才说话。
  • 后序:等所有人都说完了,我才发言。
  • 层序:我按职位高低,逐级汇报。

这些思想不仅适用于树,也适用于项目管理、人际关系……甚至写代码时的逻辑设计!


🎉 总结:二叉树不只是数据结构,更是哲学 🌍

概念意义
🌳 树自然界的抽象,层次分明
🔄 递归解决复杂问题的魔法
🔍 遍历不同视角下的观察方式
🧩 节点世界的最小单元

“树不是用来存数据的,是用来思考的。”