struct BiTree {
char data;
struct BiTree *lchild, *rchild;
};
輸入格式:先序遍歷序列,# 表示空節點。
遞歸構建:讀取字符,若為 # 返回 NULL,否則創建節點,遞歸構建左右子樹。
struct BiTree* createBiTree(struct BiTree *bt) {
char ch = getchar();
if (ch == '#') {
bt = NULL;
} else {
bt = (struct BiTree*)malloc(sizeof(struct BiTree));
bt->data = ch;
bt->lchild = createBiTree(bt->lchild);
bt->rchild = createBiTree(bt->rchild);
}
return bt;
}
| 遍歷類型 | 順序 | 代碼片段 |
|---|---|---|
| 先序 | 根 → 左 → 右 | printf("%c ", bt->data); pre(bt->lchild); pre(bt->rchild); |
| 中序 | 左 → 根 → 右 | in(bt->lchild); printf("%c ", bt->data); in(bt->rchild); |
| 後序 | 左 → 右 → 根 | post(bt->lchild); post(bt->rchild); printf("%c ", bt->data); |
使用靜態數組模擬循環隊列:
#define MAX 100
struct BiTree* Queue[MAX];
int front = 0, rear = 0;
void levelOrder(struct BiTree *bt) {
if (!bt) return;
Queue[rear++] = bt;
while (front != rear) {
struct BiTree *p = Queue[front++];
printf("%c ", p->data);
if (p->lchild) Queue[rear++] = p->lchild;
if (p->rchild) Queue[rear++] = p->rchild;
}
}
int main() {
struct BiTree *bt = NULL;
printf("請按先序輸入二叉樹(# 表示空節點):\n");
bt = createBiTree(bt);
printf("先序: "); preOrder(bt); printf("\n");
printf("中序: "); inOrder(bt); printf("\n");
printf("後序: "); postOrder(bt); printf("\n");
printf("層序: "); levelOrder(bt); printf("\n");
return 0;
}
輸入:ABD##E##CF##G##(對應樹:A 根,左子樹 B(D,E),右子樹 C(F,G))
先序: A B D E C F G 中序: D B E A F C G 後序: D E B F G C A 層序: A B C D E F G
getchar() 會讀取換行符,實際使用時需處理(如 scanf(" %c", &ch) 跳過空白)。