typedef char ElemType;
typedef struct tagBinaryTree {
ElemType data;
struct tagBinaryTree *lchild, *rchild;
} BTree;
非遞歸演算法依賴兩大容器,原碼已提供完整實現:
CreateBinaryTree()先序輸入,# 表示空節點:
ABD##E##CF##G## → 完整二叉樹
| 遍歷序 | 訪問順序 | 函數 |
|---|---|---|
| 先序 | 根 → 左 → 右 | PreOrderTraverse |
| 中序 | 左 → 根 → 右 | InOrderTraverse |
| 後序 | 左 → 右 → 根 | PostOrderTraverse |
LevelOrderTraverse()佇列 BFS,逐層由左至右訪問。
GetDepth():樹高 = max(左高, 右高) + 1GetLeafCount()、GetCountOfOneDegree()、GetCountOfTwoDegree()、GetNodesCount()IsBalanceBinaryTree():任意節點左右子樹高度差 ≤ 1TraverseLeafNodes():僅輸出葉節點值GetLevelByValue():查找節點層級 (根為第 1 層)SwapLeftRightSubtree():鏡像翻轉整棵樹NoneRecursionInOrder()while (p || !IsStackEmpty(s)) {
if (p) { Push(s, *p); p = p->lchild; }
else { Pop(s, &q); visit(q); p = q->rchild; }
}
NoneRecursionPreOrder()while (p || !IsStackEmpty(s)) {
while (p) { visit(p); Push(s, *p); p = p->lchild; }
Pop(s, &q); p = q->rchild;
}
NoneRecursionPostOrder()雙棧法:stack[] 存節點,tag[] 標記 0=左子樹已訪、1=右子樹已訪。
main()讀取 test.txt (內容:ABC##DE#G##F###),依序展示:
conio.h、getch() 非標準依賴IsBalanceBinaryTree() 重複計算深度 (O(n²)),可改為後序回傳高度並檢查 (O(n))GetLevelByValue() 若樹中有重複值會返回首次匹配層級,建議明確文檔化tag[] 固定大小 STACK_INIT_SIZE,深度超過會溢出,應改用動態陣列MAX_QUEUE_SIZE=10 過小,實際應動態分配或設為足夠大OK/ERROR/OVERFLOW 建議改用 enum 增強可讀性| 操作 | 時間 | 空間 | 備註 |
|---|---|---|---|
| 建樹 | O(n) | O(h) 遞歸棧 | h 為樹高 |
| 遞歸遍歷 | O(n) | O(h) | |
| 層序遍歷 | O(n) | O(w) | w 為最大寬度 |
| 非遞歸遍歷 | O(n) | O(h) | 顯式棧 |
| 屬性統計 | O(n) | O(h) | 平衡檢查可優化至 O(n) |