樹是 n (n≥0) 個節點的有限集。n=0 為空樹。非空樹滿足:① 唯一根節點 ② 其餘節點可分 m 個互不相交子樹,各自又是樹。
| 術語 | 定義 |
|---|---|
| 度 | 節點擁有的子樹數 |
| 葉節點 | 度為 0 |
| 分支節點 | 度 ≠ 0 |
| 層次 | 根為第 1 層 |
| 深度/高度 | 最大層次數 |
| 有序樹 | 子樹有左右順序 |
| 森林 | m 棵互不相交樹的集合 |
定義:n 個節點有限集,或為空,或由根 + 左右兩棵互不相交二叉樹組成。
特點:① 每節點最多兩子樹 ② 左右有序 ③ 單子樹必區分左右。
typedef struct BitNode {
char data;
struct BitNode *lchild, *rchild;
} BitNode, *BitTree;
// 1. 前序:根 → 左 → 右
void PreOrder(BitTree T) {
if (!T) return;
putchar(T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
// 2. 中序:左 → 根 → 右
void InOrder(BitTree T) {
if (!T) return;
InOrder(T->lchild);
putchar(T->data);
InOrder(T->rchild);
}
// 3. 後序:左 → 右 → 根
void PostOrder(BitTree T) {
if (!T) return;
PostOrder(T->lchild);
PostOrder(T->rchild);
putchar(T->data);
}
// 4. 層次:隊列 BFS
void LevelOrder(BitTree T) {
queue q; q.push(T);
while (!q.empty()) {
BitTree p = q.front(); q.pop();
putchar(p->data);
if (p->lchild) q.push(p->lchild);
if (p->rchild) q.push(p->rchild);
}
}
void CreateBitTree(BitTree *T) {
char ch; scanf("%c", &ch);
if (ch == '#') *T = NULL;
else {
*T = (BitTree)malloc(sizeof(BitNode));
(*T)->data = ch;
CreateBitTree(&(*T)->lchild);
CreateBitTree(&(*T)->rchild);
}
}
// 輸入示例:AB#D##C## (# 代表空節點)
利用 n+1 個空指針域存儲前驅/後繼:
ltag=1 → lchild 指向前驅;ltag=0 → 指向左孩子
rtag=1 → rchild 指向後繼;rtag=0 → 指向右孩子
實現 O(1) 找前驅後繼,適合頻繁遍歷場景。
掌握以上知識點,可覆蓋數據結構考研、面試、工程應用中 95% 的樹與二叉樹考點。