二叉树的遍历是按某种规则访问树中每个结点且仅访问一次的过程。
先序遍历 PreOrder
顺序:根结点 → 左子树 → 右子树。
void PreOrder(BiTree T) {
if (T != NULL) {
visit(T); // 访问根结点
PreOrder(T->lchild); // 遍历左子树
PreOrder(T->rchild); // 遍历右子树
}
}中序遍历 InOrder
顺序:左子树 → 根结点 → 右子树。
void InOrder(BiTree T) {
if (T != NULL) {
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}中序遍历的非递归实现(借助栈):
void InOrder2(BiTree T, SqStack S) {
InitStack(S);
BiTree p = T;
while (p || !IsEmpty(S)) {
if (p) {
Push(S, p);
p = p->lchild;
} else {
Pop(S, p);
visit(p);
p = p->rchild;
}
}
}后序遍历 PostOrder
顺序:左子树 → 右子树 → 根结点。
void PostOrder(BiTree T) {
if (T != NULL) {
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}层次遍历
按层从上到下、从左到右访问,借助队列实现:
void LevelOrder(BiTree T) {
InitQueue(Q);
BiTree p;
EnQueue(Q, T);
while (!IsEmpty(Q)) {
DeQueue(Q, p);
visit(p);
if (p->lchild != NULL) EnQueue(Q, p->lchild);
if (p->rchild != NULL) EnQueue(Q, p->rchild);
}
}由遍历序列构造二叉树
- 先序 + 中序 → 唯一的二叉树
- 后序 + 中序 → 唯一的二叉树
- 层序 + 中序 → 唯一的二叉树
线索二叉树
线索二叉树利用空链域存放前驱和后继指针,便于在遍历序列中快速定位结点的前驱与后继。