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

在本章中,我们将探索树状算法 (Tree Algorithms)。虽然听到“树”可能会让你想起公园里的绿色植物,但在计算机科学中,它们是组织数据最强大的工具之一。无论是在电脑中搜索文件,还是在电子字典中查找单词,背后往往都有树状算法在运作!阅读完这份笔记后,你将能理解这些结构的运作原理,并像专业人士一样轻松地“遍历”它们。

1. 什么是树 (Tree)?

在深入研究算法之前,我们先快速复习一下什么是树。树 (Tree) 是一种看起来像倒过来的真实树木的数据结构。它从一个单一点开始,然后向外分支出去。

必须记住的关键术语:

节点 (Node): 树中的单个元素(通常包含数据,如数字或名称)。
根节点 (Root): 树的最顶端节点。每棵树都恰好有一个根节点。
边 (Edge): 连接节点之间的线或链接。
父节点 (Parent): 拥有指向其下方节点链接的节点。
子节点 (Child): 拥有来自上方节点链接的节点。
叶节点 (Leaf): 没有任何子节点的节点(树枝的“尽头”)。

比喻: 想象一下家谱!“根节点”是祖先。他们的后代就是“子节点”。如果某人没有后代,那他就是一个“叶节点”。

快速回顾: 除了根节点外,每个节点都恰好有一个父节点,但一个父节点可以拥有多个子节点!

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

二叉树 (Binary Tree) 是一种特殊的树,其中每个节点最多只能有两个子节点(通常称为左子节点和右子节点)。

二叉搜索树 (BST) 增加了一条非常重要的规则,帮助我们快速找到数据:
1. 比父节点的数据放在左边
2. 比父节点的数据放在右边

为什么这很有用?

由于这个“左小右大”的规则,搜索数值的速度会变得非常快。我们不必像查看列表那样逐一检查每个项目,而是每次向下移动一层时,都能排除掉一半的树。平衡二叉搜索树的搜索时间效率通常为 \( O(\log n) \)。

重点总结: BST 是为速度而设计的。它将漫长的搜索过程转化为一系列简单的“左还是右?”的决策。

3. 树的遍历算法 (Tree Traversal Algorithms)

遍历 (Traversal) 是指以特定顺序访问树中每个节点的专业术语。在 Oxford AQA 9645 的课程大纲中,你需要掌握三种“深度优先 (Depth-First)”的方法。别担心名称听起来很像,我们有个小窍门能帮你记住它们!

方法一:前序遍历 (Pre-order Traversal)

在前序遍历中,我们在访问子节点之前先访问根节点。
顺序:根节点 \(\rightarrow\) 左节点 \(\rightarrow\) 右节点

用途: 复制一棵树,或显示目录结构。

方法二:中序遍历 (In-order Traversal)

在中序遍历中,我们在左子节点和右子节点之间访问根节点。
顺序:左节点 \(\rightarrow\) 根节点 \(\rightarrow\) 右节点

神奇的事实: 如果你对二叉搜索树执行中序遍历,你将会以完美的数值或字母顺序访问所有节点!

方法三:后序遍历 (Post-order Traversal)

在后序遍历中,我们在访问完所有子节点之后才访问根节点。
顺序:左节点 \(\rightarrow\) 右节点 \(\rightarrow\) 根节点

用途: 删除树(你必须先删除子节点才能删除父节点)或计算数学表达式树。

记忆技巧 - “根节点规则”:
- Pre 代表“之前” \(\rightarrow\) 根节点在最前 (First)
- In 代表“中间” \(\rightarrow\) 根节点在中间 (Middle)
- Post 代表“之后” \(\rightarrow\) 根节点在最后 (Last)

4. 遍历的“点点技巧”(The Dot Trick)

如果在考试中需要追踪遍历过程,请使用这个“秘密方法”。它绝对管用!

第一步: 在树的每个节点上画一个小点。
- 若为前序遍历,把点画在节点的左侧
- 若为中序遍历,把点画在节点的底部
- 若为后序遍历,把点画在节点的右侧

第二步: 想象一支笔从根节点的左侧开始,画出一条持续不断的线,沿着树的外缘“环绕”(就像一个人绕着树边走一样)。

第三步: 每当你的线经过一个点,就写下该节点的值。写下来的顺序就是你的答案!

快速回顾: 这种物理上的“描边”方法是最安全的方式,能确保你不会遗漏节点或搞混顺序。

5. 在 BST 中加入新节点

要将新数据加入二叉搜索树,我们遵循与搜索相同的逻辑。我们从根节点开始,将新值与当前节点进行比较。

逐步流程:

1. 树是空的吗?如果是,新值将成为根节点
2. 如果不是,将新值与当前节点比较。
3. 比当前节点吗?移动到左子节点
4. 比当前节点吗?移动到右子节点
5. 重复此过程,直到到达一个空的点(“边”)。
6. 将你的新节点放在那里。

常见错误: 学生有时会试图在加入节点时“重新排列”树。千万别这么做!新节点永远是作为分支末端的一个新的“叶节点”被加入的。

总结:考试关键重点

结构: 树由节点和边组成。顶端是根节点;末端是叶节点。
BST 规则: 左子节点 \( < \) 父节点;右子节点 \( > \) 父节点。
遍历:
- 前序 (Pre-order): 根、左、右(用于复制)
- 中序 (In-order): 左、根、右(用于排序)
- 后序 (Post-order): 左、右、根(用于删除)
效率: 在平衡的情况下,搜索 BST 的效率远高于线性搜索,其复杂度为 \( O(\log n) \)。

如果一开始觉得遍历有点混乱,别担心!试着画一个有 3 个节点(数字 10、5 和 15)的小树,练习一下“点点技巧”。只要练习两次,这就会变成你的直觉!