BinTree &bt (C++ 參考) 而非 C 語法 BinTree *bt,且遞歸呼叫未傳址,導致根節點無法回傳。stack[top]=bt 初始化後未判空直接入堆疊,stack[top]=stack[top-1]->lchild 易導致野指標。tag 標記但邏輯混亂,回傳值型別不匹配。found, p 耦合度高,非執行緒安全。bt 未初始化,Case 1 建樹後未賦值回主函式。gets/scanf 混用導致緩衝區殘留字元干擾。Status 表示成功/失敗。while (p || top != -1) { while(p) push(p), p=p->lchild; p=pop(); visit(p); p=p->rchild; }getchar() 讀單字元,以 # 代表空節點,避免空格歧義。/* 建立二叉樹:先序輸入,# 表空節點 */
Status CreateBiTree(BinTree *T) {
char ch;
scanf(" %c", &ch); // 空格跳過換行/空白
if (ch == '#') {
*T = NULL;
} else {
*T = (BinTNode *)malloc(sizeof(BinTNode));
if (!*T) return ERROR;
(*T)->data = ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
return OK;
}
/* 非遞歸中序遍歷 */
Status InorderTraverse(BinTree T) {
BinTNode *stack[MAXSIZE];
int top = -1;
BinTNode *p = T;
while (p || top != -1) {
while (p) {
stack[++top] = p;
p = p->lchild;
}
p = stack[top--];
printf("%c ", p->data);
p = p->rchild;
}
return OK;
}
/* 尋找節點並回傳路徑 (遞歸回溯) */
bool FindPath(BinTree T, char target, BinTNode **path, int *len) {
if (!T) return false;
path[(*len)++] = T;
if (T->data == target) return true;
if (FindPath(T->lchild, target, path, len) || FindPath(T->rchild, target, path, len))
return true;
(*len)--;
return false;
}
/* 深度、葉子數、鏡像交換遞歸寫法簡潔正確,保留即可 */
int TreeDepth(BinTree T) { ... }
int LeafCount(BinTree T) { ... }
BinTree MirrorTree(BinTree T) { ... }
int main() {
BinTree root = NULL;
int choice;
while (1) {
print_menu();
scanf("%d", &choice); getchar();
switch (choice) {
case 1: CreateBiTree(&root); puts("建樹完成"); break;
case 2: InorderTraverse(root); putchar('\n'); break;
case 3: { /* 讀目標字元 -> FindPath -> 印路徑 */ } break;
case 4: printf("深度=%d\n", TreeDepth(root)); break;
case 5: printf("葉子數=%d\n", LeafCount(root)); break;
case 6: root = MirrorTree(root); puts("鏡像完成"); break;
case 0: FreeTree(root); return 0;
}
}
}
malloc 失敗必須檢查回傳值,避免解參考空指標。while(getchar()!='\n');),防止殘留字元導致無限迴圈。二叉樹基本操作是資料結構核心功課。掌握 指標傳址建樹、非遞歸遍歷模板、遞歸回溯找路徑 三大模式,即可應對絕大多數考試與面試題目。程式碼簡潔、邊界處理完善、記憶體管理正確,才是合格的 C 語言實作。