非递归实现二叉树的遍历
先序遍历
1。先遍历根节点,在把右孩子入栈,在把左孩子入栈(最先入栈的右孩子,最后出栈,最后遍历)
2。如果栈不为空,则出栈,并重复第一步。
void preOrderTraverse(BiTree T){
InitStack(S);
Push(S,T);
BiNode * p;
while(!StackEmpty(S)){
Pop(S,p);
visit(p);
if(p->rchild!=null) Push(S,p->rchild);
if(p->lchild!=null) Push(S,p->lchild);
}
}
中序遍历
1。从根结点向左遍历并全部入栈,直至无左孩子
2。如果栈不为空,出栈并visit结点,
3。若有右子树,则把右子树作为根结点执行第一步。
void putINStack(BiNode *p,Stack S){
Push(S,p);
while(p->lchild!=null){
Push(S,p->lchild);
p = p->lchild;
}
}
void InOrderTraverse1(BiNode *p){
InitStack(S);
putINStack(p,S);
BiNode * q;
while(!StackEmpty(S)){
Pop(S,q);
visit(q);
if(q->rchild!=null) putINStack(q->rchild,S);
}
}
void InOrderTraverse2( BiNode *x) { //二叉树中序遍历算法(迭代版#2)
InitStack(S); //辅助栈
while ( true )
if ( x ) {
Push(S,x); //根节点进栈
x = x->lc; //深入遍历左子树
} else if ( !StackEmpty() ) {
Pop(S,x); //尚未访问的最低祖先节点退栈
visit ( x->data ); //访问该祖先节点
x = x->rc; //遍历祖先的右子树
} else
break; //遍历完成
}
后续遍历