樹型結構是非線性數據結構的核心,廣泛應用於文件系統、數據庫索引(B+ 樹)、編譯器語法樹、網絡路由等場景。本文系統梳理樹的定義、核心術語、性質、存儲結構及基本操作 ADT,為後續二叉樹、平衡樹、B 樹等進階主題打下基礎。
樹 是 n (n ≥ 0) 個節點的有限集合。當 n = 0 時稱空樹。任意非空樹滿足:

以圖中樹為例:
| 術語 | 定義 | 示例值 |
|---|---|---|
| 根 | 無前驅節點 | A |
| 度 | 節點擁有的子樹數 | C 的度 = 3(最大),樹的度 = 3 |
| 葉子/終端節點 | 度為 0 | D, E, F, G, I, K |
| 分支/非終端節點 | 度 ≠ 0 | A, B, C, H, J |
| 內部節點 | 除根外的分支節點 | B, C, H, J |
| 孩子/子節點 | 節點子樹的根 | B、C 是 A 的孩子 |
| 雙親/父節點 | 孩子的上一層節點 | A 是 B、C 的雙親 |
| 兄弟 | 同一雙親的孩子 | B、C 互為兄弟 |
| 層次 | 根為第 1 層,依次遞增 | E 在第 3 層 |
| 深度/高度 | 最大層次數 | 5 |
| 有序樹/無序樹 | 子樹有無左右順序之分 | 圖中為有序樹 |
| 森林 | m (m ≥ 0) 棵互不相交樹的集合 | 刪除根 A 後得到 {B 子樹, C 子樹} |
ADT Tree {
數據對象: 節點集合
數據關係: 父子層次關係
基本操作:
InitTree(&T) // 構造空樹
DestroyTree(&T) // 銷毀樹
CreateTree(&T, def) // 按定義構造樹
ClearTree(&T) // 清空為空樹
TreeEmpty(T) // 判空
TreeDepth(T) // 返回深度
Root(T) // 返回根節點
Value(T, e) // 返回節點 e 的值
Assign(T, e, value) // 賦值
Parent(T, e) // 返回雙親,根返回 NULL
LeftChild(T, e) // 返回最左孩子,葉子返回 NULL
RightSibling(T, e) // 返回右兄弟,無則 NULL
InsertChild(&T, &p, i, c) // 插入 c 為 p 的第 i 棵子樹
DeleteChild(&T, &p, i) // 刪除 p 的第 i 棵子樹
TraverseTree(T, Visit) // 遍歷(先序/後序/層序等)
}
parent 索引。查父 O(1),查子 O(n)。firstChild 指向長子,nextSibling 指向右兄弟。任意樹可唯一轉換為二叉樹,統一操作邏輯。// 孩子兄弟表示法節點結構
typedef struct CSNode {
ElemType data;
struct CSNode *firstChild, *nextSibling;
} CSNode, *CSTree;
注意:樹無「中序遍歷」概念,因無左右子樹之分。
樹是演算法與系統設計的基石,深入理解其結構特性與轉換關係,能讓你在面對層次化、遞歸化問題時游刃有餘。