树是一种非线性数据结构,由节点(Node)和连接节点的边(Edge)组成,具有层次关系。它模拟了现实世界中的层级结构,例如文件系统、家族谱系、HTML DOM 等。
一、树的定义
树是 n(n ≥ 0)个节点的有限集合。当 n = 0 时称为空树;当 n > 0 时满足:
-
有且仅有一个特定的节点称为根节点(Root);
-
其余节点可分为 m(m ≥ 0)个互不相交的有限集合,每个集合本身又是一棵树,称为原树的子树(Subtree)。
这个定义是递归的------树由子树构成,子树又是更小的树。
二、基本术语
| 术语 | 含义 |
|---|---|
| 节点 | 树中的基本数据单元,包含数据和指向子节点的引用 |
| 根节点 | 树的最顶层节点,没有父节点 |
| 父节点 / 子节点 | 若节点 A 有一条边连接到 B,则 A 是 B 的父节点,B 是 A 的子节点 |
| 兄弟节点 | 拥有同一个父节点的节点 |
| 叶子节点 | 度为 0 的节点(没有子节点) |
| 内部节点 | 度大于 0 的节点(非叶子节点) |
| 度 | 一个节点拥有的子节点个数 |
| 树的度 | 树中所有节点度的最大值 |
| 深度 / 高度 | 从根节点到某个节点的路径长度称为该节点的深度;从某个节点到最远叶子节点的路径长度称为该节点的高度。树的深度等于根节点的高度 |
| 层 | 根节点在第 1 层,其子节点在第 2 层,以此类推 |
| 森林 | m(m ≥ 0)棵互不相交的树的集合 |
三、常见树的类型
| 类型 | 特点 |
|---|---|
| 二叉树 | 每个节点最多有两个子节点(左孩子、右孩子) |
| 二叉搜索树 | 左子树所有节点值小于根,右子树所有节点值大于根 |
| 完全二叉树 | 除最后一层外全满,最后一层节点靠左排列 |
| 满二叉树 | 每一层节点数都达到最大值 |
| **平衡二叉树(AVL)** | 任意节点左右子树高度差不超过 1 |
| 红黑树 | 近似平衡的二叉搜索树,保证最长路径不超过最短路径的两倍 |
| B 树 / B+ 树 | 多路平衡查找树,常用于数据库索引 |
| 堆 | 完全二叉树,分为最大堆和最小堆 |
| **Trie(字典树)** | 用于字符串检索的多叉树 |
四、树的存储方式
-
顺序存储(数组):适用于完全二叉树,利用下标关系定位父子节点。
-
链式存储 :每个节点包含数据域和若干指针域(指向子节点),最常用的是二叉链表(
left、right指针)。
五、树的遍历
| 遍历方式 | 顺序(以二叉树为例) |
|---|---|
| 前序 | 根 → 左子树 → 右子树 |
| 中序 | 左子树 → 根 → 右子树 |
| 后序 | 左子树 → 右子树 → 根 |
| 层序 | 从上到下、从左到右逐层访问 |