欢迎来到树状结构的世界!

你好!今天我们要深入探讨计算机科学中,最重要且优雅的数据组织方式之一:树 (Trees)。虽然你之前已经接触过数组 (arrays) 和栈 (stacks) 这类线性结构,但树是层次化 (hierarchical) 的。这意味着它们非常适合呈现事物之间的从属关系,例如电脑里的文件夹或族谱。

如果刚开始觉得这些概念有点抽象,别担心!我们会一步步拆解,并透过大量生动的比喻,帮助你拓展知识的枝叶!


1. 到底什么是树?

在 AQA 课程大纲中,有非常具体的数学定义。它是一个连通、无向且无环的图 (connected, undirected graph with no cycles)

让我们把这些专业术语转化成简单的说法:

  • 连通 (Connected): 你可以通过线条从树的任何一部分到达另一部分,没有任何“漂浮”在外的节点。
  • 无向 (Undirected): 线条(边)没有箭头,不指定单一方向。
  • 无环 (No Cycles): 这点最重要!意即图中没有回路。你不能从一点出发,沿着路径走,在不回头的情况下又回到起点。

你知道吗? 在数学上,树其实不需要有“起点”或根节点。但在计算机科学中,我们几乎总是处理有根树 (Rooted Trees)

有根树的关键术语

当我们选定一个节点作为“起点”时,称之为根节点 (Root)。一旦有了根节点,其他所有节点都会成为它的后代 (descendant)。这就建立了父子关系 (parent-child relationship)

  • 节点 (Node): 单一的数据元素(也就是那些“圆圈”)。
  • 边 (Edge): 连接两个节点的线。
  • 根节点 (Root): 唯一没有父节点的节点,是位居顶端的“大佬”。
  • 父节点 (Parent): 拥有指向下方节点的边的节点。
  • 子节点 (Child): 由上方节点连接而来的节点。
  • 叶节点 (Leaf): 没有任何子节点的节点。它们是树的“末端”。

重点总结: 树就是一种连通且无环的图。在计算机科学中,我们通常指定一个节点为“根节点”来构建层次结构。


2. 二叉树 (Binary Tree)

二叉树 (Binary Tree) 是一种特殊的有根树,在考试中会经常出现。规则很简单:每个节点最多只能有两个子节点。

把它想象成一个家庭,每个人最多只能生两个小孩。我们通常称之为“左子节点 (Left Child)”和“右子节点 (Right Child)”。

二叉搜索树 (Binary Search Tree, BST)

二叉树最常见的应用是二叉搜索树 (BST)。这是一种为了让数据搜索变得极快而特别设计的结构,每个节点都遵循严格的规则:

  • 比父节点的值放在左边
  • 比父节点的值放在右边

记忆小撇步: “左小右大”。如果数字比较小,就往左转!

快速回顾:二叉搜索树的效率

由于你在向下移动每一层时,基本上都将剩余的节点数量减半,因此搜索平衡二叉树的效率非常高。在大 O 符号 (Big O Notation) 中,搜索二叉树的时间复杂度为 \(O(\log n)\)。


3. 树的遍历 (Tree Traversals)

有时我们需要访问树中的每一个节点(例如将它们打印出来或进行复制)。这称为遍历 (traversing)。因为树不是直线的,我们有三种主要方法,这取决于何时访问根节点

1. 前序遍历 (Pre-Order Traversal)

顺序: 根节点 \(\rightarrow\) 左子树 \(\rightarrow\) 右子树
运作方式: 先访问根节点,接着遍历整个左子树,最后遍历整个右子树。
典型用途: 用于复制树结构。如果你想重制这棵树,首先必须知道根节点在哪里!

2. 中序遍历 (In-Order Traversal)

顺序: 左子树 \(\rightarrow\) 根节点 \(\rightarrow\) 右子树
运作方式: 先遍历左子树,访问根节点,最后遍历右子树。
典型用途: 如果对二叉搜索树进行中序遍历,输出的内容会是升序排列(例如 1, 2, 3...)。

3. 后序遍历 (Post-Order Traversal)

顺序: 左子树 \(\rightarrow\) 右子树 \(\rightarrow\) 根节点
运作方式: 先访问所有子节点,最后才访问根节点。
典型用途: 用于删除树(在删除子节点之前,你无法删除父节点!)或将算式转换为逆波兰表示法 (Reverse Polish Notation, RPN)

如果觉得这部分很难,别担心! 考试时有一个简单的“轮廓技巧”。想像在树的外围画一条紧密的线(轮廓),从根节点的左侧开始。如果你在每个节点的左侧标记一个点,按顺序连接起来就是前序遍历 (Pre-Order);标记在下方中序遍历 (In-Order);标记在右侧则是后序遍历 (Post-Order)

重点总结: 遍历只是穿过树的不同“路径”。前序用于复制,中序用于排序,后序则用于 RPN 或清空树。


4. 关键概念总结

在继续往下学习之前,请确保你已经掌握这些“必备知识点”:

  • 树的定义: 连通、无向且无环的图。
  • 有根树: 拥有一个核心(根节点)的树。
  • 二叉树: 每个节点最多只有 2 个子节点的树。
  • 搜索复杂度: 搜索二叉树通常为 \(O(\log n)\)。
  • 遍历顺序: 记住这些顺序!
    • 前序 (Pre-Order):、左、右
    • 中序 (In-Order):左、、右
    • 后序 (Post-Order):左、右、

避免常见错误: 不要假设每一棵树都是二叉树!一般的树在每个节点上可以有任意数量的子节点,只有“二叉”树才限制为两个。

做得好!你刚刚已经掌握了数据结构中“树”的基础。继续练习画出这些遍历路径,你很快就会成为高手!