在编程的世界里,有些概念听起来就像是从科幻小说中直接跳出来的。比如今天我们要聊的“二叉树”,这不仅仅是一种数据结构,它更像是一个神秘的迷宫,充满了挑战与乐趣。想象一下,你站在一个巨大的迷宫入口,前方有无数条路径等待着你去探索——这就是二叉树的魅力所在。🧐
“树是递归定义的,就像生活本身。”
🌲 什么是二叉树?💡
简单来说,二叉树是一棵“最多有两个孩子”的树形结构。它由以下几部分组成:
- ✅ 根节点(Root) :整棵树的起点,只有一个。
- ✅ 左子树 和 右子树:每个节点最多有两个子节点,且顺序严格区分(不能交换!)
- ✅ 叶子节点(Leaf) :没有孩子的节点,就像树梢上的树叶🍃。
⚠️ 注意:二叉树 ≠ 度为2的树!
比如一个节点只有左子树,也属于合法二叉树!
我们先来看一张图,直观感受一下树的结构👇:
👉 这就是一棵典型的树结构,蓝色的是内部节点,绿色的是叶子节点。根节点在最下面,往上延伸,像倒挂的树一样(因为计算机里的树是“倒着长”的 😂)。
🧱 二叉树的内存表示:用对象构建一棵树 💻
在 JavaScript 中,我们可以用 TreeNode 类来表示每个节点:
class TreeNode {
constructor(val) {
this.val = val;
this.left = this.right = null;
}
}
每个节点包含:
val:值(比如数字、字母)left:指向左子节点的引用right:指向右子节点的引用
来看看它在内存中的样子👇:
🧠 小知识:这种结构叫「链式存储」,和数组不同,它不连续,但更灵活!
🎯 二叉树的遍历:三种方式,三种人生观 🧭
遍历就是“走一遍树的所有节点”。根据访问根节点的时间不同,分为三种:
| 遍历方式 | 访问顺序 |
|---|---|
| 前序遍历 | 根 → 左 → 右 |
| 中序遍历 | 左 → 根 → 右 |
| 后序遍历 | 左 → 右 → 根 |
让我们以这棵树为例👇:
🔹 前序遍历(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]
👉 就像坐热气球飞过森林,一层一层看过去,视野开阔!
🤔 思考时间:为什么需要这么多遍历?
你以为只是“打印顺序”不一样?错!它们代表了不同的思维方式:
- 前序:我先认识自己,再认识我的朋友。
- 中序:我左边的人说了啥,我才说话。
- 后序:等所有人都说完了,我才发言。
- 层序:我按职位高低,逐级汇报。
这些思想不仅适用于树,也适用于项目管理、人际关系……甚至写代码时的逻辑设计!
🎉 总结:二叉树不只是数据结构,更是哲学 🌍
| 概念 | 意义 |
|---|---|
| 🌳 树 | 自然界的抽象,层次分明 |
| 🔄 递归 | 解决复杂问题的魔法 |
| 🔍 遍历 | 不同视角下的观察方式 |
| 🧩 节点 | 世界的最小单元 |
“树不是用来存数据的,是用来思考的。”