/**********
【题目】试利用栈及其基本操作写出二叉树T的非递归
的中序遍历算法。
二叉链表类型定义:
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode, *BiTree;
可用栈类型Stack的相关定义:
typedef BiTree SElemType; // 栈的元素类型
Status InitStack(Stack &S);
Status StackEmpty(Stack S);
Status Push(Stack &S, SElemType e);
Status Pop(Stack &S, SElemType &e);
Status GetTop(Stack S, SElemType &e);
**********/
void InOrder (BiTree T, Status (*visit) (TElemType e) ) { //中序非递归遍历二叉树T,visit是对数据元素操作的应用函数
LStack S; InitStack (S);
BiTree p= T;
while(p->lchild) { //从T结点出发,沿左分支走到底,找到最左下的结点,沿途结点指针入栈
Push (S,p); p=p->lchild; }
while(p){
visit(p->data); //访问结点
if(p->rchild) { //若当前结点有右孩子
p=p->rchild;
while(p->lchild) {
Push (S,p); p=p->lchild; } //令p指向其右孩子为根的子树的最左下结点,沿途结点指针入栈
}
else if (!StackEmpty (S) )
Pop(S,p); //栈不空时退栈
else p=NULL; //栈空表明遍历结束
}
}