这里写自定义目录标题
#PE23
/**********
【题目】试利用栈及其基本操作写出二叉树T的非递归
的后序遍历算法(提示:为分辨后序遍历时两次进栈的
不同返回点,需在指针进栈时同时将一个标志进栈)。
二叉链表类型定义:
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode, *BiTree;
可用栈类型Stack的相关定义:
typedef struct {
struct BiTNode *ptr; // 二叉树结点的指针类型
int tag; // 0…1
} 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 PostOrder(BiTree T, void (*visit)(TElemType))
/* 使用栈,非递归后序遍历二叉树T, */
/* 对每个结点的元素域data调用函数visit */
{
if(T == NULL) return;
Stack s; InitStack(s);
int fistIn=0,left=1,right=2;
SElemType now;
now.ptr=T;
now.tag=fistIn;
Push(s,now);
while(!StackEmpty(s)){
Pop(s,now);
if(now.tag==fistIn){
//如果当前是第一次进栈,先置为从左栈返回.
now.tag=left;
Push(s,now);
if(now.ptr->lchild){
now.ptr=now.ptr->lchild;
now.tag=fistIn;
Push(s,now);
}
}else if(now.tag==left){
//如果当前是从左栈返回的,先置为从右栈返回.
now.tag=right;
Push(s,now);
if(now.ptr->rchild){
now.ptr=now.ptr->rchild;
now.tag=