利用數組下標隱式表示父子關系:根節點存 T[0],節點 i 的左子節點在 2i+1,右子節點在 2i+2,父節點在 (i-1)/2。適用於完全二叉樹或滿二叉樹;一般二叉樹需用特殊值(如空格 ' ')標記空節點,可能造成空間浪費。
#define MAX_TREE_SIZE 100
typedef char TElemType;
typedef TElemType SqBiTree[MAX_TREE_SIZE]; // 0號單元存根節點
TElemType Nil = ' '; // 空節點標記
typedef struct { int level, order; } position; // (層號, 本層序號)
void InitBiTree(SqBiTree T) {
for (int i = 0; i < MAX_TREE_SIZE; ++i) T[i] = Nil;
}
// 按層序輸入創建(輸入 '#' 表示空節點)
void CreateBiTree(SqBiTree T) {
char ch; int i = 0;
while ((ch = getchar()) != '\n' && i < MAX_TREE_SIZE) {
if (ch != '#') T[i] = ch;
++i;
}
}
int BiTreeDepth(SqBiTree T) {
if (T[0] == Nil) return 0;
int i = MAX_TREE_SIZE - 1;
while (T[i] == Nil) --i; // 找最後非空節點
int depth = 0;
while (i >= 0) { i = (i - 1) / 2; ++depth; } // 往上跳至根
return depth;
}
void PreTraverse(SqBiTree T, int i, void (*Visit)(TElemType)) {
if (T[i] == Nil) return;
Visit(T[i]);
PreTraverse(T, 2*i+1, Visit);
PreTraverse(T, 2*i+2, Visit);
}
void LevelOrderTraverse(SqBiTree T, void (*Visit)(TElemType)) {
int i = MAX_TREE_SIZE - 1;
while (T[i] == Nil) --i;
for (int j = 0; j <= i; ++j)
if (T[j] != Nil) Visit(T[j]);
}
插入:將原子樹遷移為新子樹的右子樹,再掛接新子樹。刪除:層序遍歷待刪子樹根,入隊所有後代下標,逐個置 Nil。
截圖展示了交互式菜單操作流程與各功能輸出結果,驗證代碼完整性。
| 優點 | 缺點 |
|---|---|
| 實現簡單,無指針操作,適合初學者理解樹的邏輯結構 | 非完全二叉樹空間利用率極低(指數級浪費) |
| 隨機訪問 O(1),易於實現層序遍歷 | 插入刪除需大量數據移動,不適合動態變化頻繁的場景 |
| 易於序列化存儲(直接 dump 數組) | 最大深度受數組大小限制 |