树的基本概念
树是一种非线性数据结构,以层次化方式组织数据。它在文件系统、编译原理和数据库索引中应用广泛。
树的定义
树(Tree)是由 n(n≥0)个有限结点组成的具有层次关系的集合。当 n=0 时称为空树。非空树中:
- 有且仅有一个根结点,没有前驱。
- 除根结点外,其余结点分成 M(M>0)个互不相交的集合 T₁...Tₘ,每个集合本身也是一棵树,称为子树。
树的定义是递归的:由根和若干互不相交的子树构成。
相关术语
- 结点的度:拥有的子树个数。
- 叶结点:度为 0 的结点。
- 分支结点:度不为 0 的结点。
- 父结点与子结点:若 A 有孩子 B,则 A 是父结点,B 是子结点。
- 兄弟结点:具有相同父结点的结点。
- 树的度:所有结点度的最大值。
- 结点的层次:从根开始,根为第 1 层。
- 树的高度:最大层次数。
- 森林:m(m≥0)棵互不相交树的集合。
树的表示
实际编程中常用孩子兄弟表示法(左孩子右兄弟)。它将任意树转化为二叉树形式,方便处理。
typedef int DataType;
struct Node {
struct Node* firstChild; // 指向第一个孩子
struct Node* pNextBrother; // 指向下一个兄弟
DataType data; // 数据域
};
实际应用
典型例子是文件系统的目录树结构。根目录对应根结点,子目录和文件对应分支和叶结点,便于高效管理。
二叉树概念及结构
定义
二叉树是每个结点最多有两个子树的树结构,子树有左右之分。定义也是递归的:要么为空,要么由根加两棵二叉树组成。
特殊二叉树
- 满二叉树:每一层结点数都达到最大值。深度为 k 时有 2^k - 1 个结点。
- 完全二叉树:结点与深度为 k 的满二叉树编号一一对应。特点包括叶结点只出现在最后两层,最后一层靠左排列。
性质
假设根结点层数为 1:
- 第 i 层最多 2^(i-1) 个结点。
- 深度为 h 的二叉树最多 2^h - 1 个结点。
- 叶子结点数 n₀ = 度为 2 的结点数 n₂ + 1。
- 具有 n 个结点的完全二叉树深度 h = ⌊log₂(n)⌋ + 1。
- 完全二叉树按从上到下、从左到右从 0 开始编号:


