typedef struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
int idx = 0;
BiTree Create(BiTree T, const char *str) {
char ch = str[idx++];
if (ch == ' ') return NULL;
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = Create(T->lchild, str);
T->rchild = Create(T->rchild, str);
return T;
}
输入示例:"abc de f g " 对应树形:
a
/ \
b e
/ / \
c f g
/ \
d (空)
void PreOrder(BiTree T) { if (T) { putchar(T->data); PreOrder(T->lchild); PreOrder(T->rchild); } }
void InOrder (BiTree T) { if (T) { InOrder(T->lchild); putchar(T->data); InOrder(T->rchild); } }
void PostOrder(BiTree T) { if (T) { PostOrder(T->lchild); PostOrder(T->rchild); putchar(T->data); } }
void PreOrderIter(BiTree T) {
BiTree st[100], p = T; int top = -1;
while (top >= 0 || p) {
while (p) { putchar(p->data); st[++top] = p; p = p->lchild; }
p = st[top--]->rchild;
}
}
void InOrderIter(BiTree T) {
BiTree st[100], p = T; int top = -1;
while (top >= 0 || p) {
while (p) { st[++top] = p; p = p->lchild; }
p = st[top--]; putchar(p->data); p = p->rchild;
}
}
// 单栈 + tag 数组:0=左子树未访问,1=右子树未访问
void PostOrderIter(BiTree T) {
BiTree st[100], p = T; int tag[100], top = -1;
do {
while (p) { st[++top] = p; tag[top] = 0; p = p->lchild; }
if (top >= 0) {
if (!tag[top]) { p = st[top]->rchild; tag[top] = 1; }
else { putchar(st[top--]->data); p = NULL; }
}
} while (p || top >= 0);
}
void LevelOrder(BiTree T) {
BiTree q[100]; int front = 0, rear = 0;
if (T) q[rear++] = T;
while (front < rear) {
BiTree p = q[front++];
putchar(p->data);
if (p->lchild) q[rear++] = p->lchild;
if (p->rchild) q[rear++] = p->rchild;
}
}
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree;
int idx = 0;
BiTree Create(BiTree T, const char *str) {
char ch = str[idx++];
if (ch == ' ') return NULL;
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch; T->lchild = T->rchild = NULL;
T->lchild = Create(T->lchild, str);
T->rchild = Create(T->rchild, str);
return T;
}
// ... 上述遍历函数 ...
int main() {
const char *str = "abc de f g ";
BiTree root = Create(NULL, str);
printf("Pre: "); PreOrderIter(root); puts("");
printf("In: "); InOrderIter(root); puts("");
printf("Post: "); PostOrderIter(root); puts("");
printf("Level:"); LevelOrder(root); puts("");
return 0;
}
输出:
Pre: abcde fg
In: cdbaefg
Post: cdbfgea
Level: abecdfg
二叉树是树形结构的基础。递归代码简洁但受栈深度限制;非递归显式栈/队列可控、通用。建议熟练掌握四种遍历的非递归写法,并能手写销毁、求高、LCA 等常考操作。理解“栈模拟系统调用栈”、“队列模拟层序”两大核心思想,举一反三应对 N 叉树、图遍历亦不在话下。