1.递归遍历程序
void Track(BiTree *p){
if(p!=NULL){
//(1)
Track(p->lchild);
//(2)
Track(p->rchild);
//(3)
}
}
访问函数visit位于 1 2 3的位置分别对应于先序、中序、后序遍历。
2.非递归函数程序
先中后序的非递归都通过栈实现,层次遍历利用队列实现。
以下为后序遍历的非递归算法实现。
typedef struct {
BTNode *p;
int rvisited;//为1表示p的右结点已经访问过
}SNode;
typedef struct{
SNode Elem[maxsize];
int top;
}SqStack;
void Post_order(BiTree T){
SNode sn;
BTNode *pt=T;
InitStack(S);//根结点开始,往左下方走,路径上每个节点入栈
while(T){
Push(pt,0);
pt=pt->lchild;
}
while(!S.IsEmpty())//栈非空
{
sn=S.getTop();//sn 是
if(sn.p->rchild==NULL || sn.rvisited){
Pop(S,pt);
visit(pt);
}
else{//处理右孩子
sn.rvisited=1;//往下走到尽头,将路劲上所有元素入栈
pt=sn.p->rchild;
while(pt!=NULL){
Push(S,pt,0);
pt=pt->lchild;
}
}//end of if
}//end of while
}