使用递归遍历树,调用的是系统分配给程序的隐式栈,下面以伪码的形式介绍前序、中序、后序遍历二叉树的非递归方法。
前序遍历:
Status preOrder(BiTree T, Status (*Visit)(TElemType e)) {
InitStack(S); p = T;
while(p || !StackEmpty(S)) {
while(p) {
visit(p->data);
push(S,p);
p = p->lchild;
}
if(!StackEmpty(S)) {
pop(S,p);
p = p->rchild;
}
}
}
中序遍历:
Status InOrder(BiTree T, Status (*Visit)(TElemType e)) {
InitStack(S); p = T;
while(p || !StackEmpty(S)) {
if(p) {
push(S,p);
p = p->lchild;
}
else {
pop(S,p);
visit(p->data);
p = p->rchild;
}
}
}
//后序遍历二叉树则相对前两者要复杂一点,一种非递归算法:
Status postOrder(BiTree T, Status (*Visit)(TElemType e)) {
InitStack(S); p = T;
while(p || !StackEmpty(S)) {
while(p) {
push(S,p);
p = p->lchild;
}
if(!StackEmpty(S)) {
sn = top(S);
if(!sn->rchild || sn.rchildVisited) {
pop(S,p);
visit(p);
}
else {
sn.rchildVisited = 1;
p = sn->rchild;
}
}
}
}
References:
[1] 数据结构(C 语言版) 严蔚敏 吴伟民 编著