试利用栈的基本操作,写出后序遍历的非递归算法。
(提示:为分辨后序遍历时两次进栈的不同返回点,需在指
针进栈时同时将一个标志进栈)。
要求实现下列函数:
void Postorder(BiTree bt, void (*visit)
(TElemType));
/*使用栈,非递归后序遍历二叉树bt, */
/*对每个结点的元素域data调用函数visit */
二叉链表类型定义:
typedef struct BiTNode {
TElemType data;
BiTNode *lchild, *rchild;
int
mark;
}BiTNode, *BiTree;
可用栈类型Stack的相关定义:
typedef struct {
BiTNode* ptr; //二叉树结点的指针类型
int
tag; // 0..1
} SElemType;//栈的元素类型
typedef struct {
SElemType *elem; //在栈构造之前和销毁之后,
elem的值为NULL
SElemType *top; // 栈顶指针
int size; // 当前已分配的存储空间,以元素为
单位
int increment; // 扩容时,增加的存储容量
} Sqstack2; //顺序栈
/-------栈的相关操作---
//构造一个空栈S
status Initstack_ Sq2(SqStack2& S);
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回
OK;否则返回ERROR
status Pop_ _Sq2(SqStack2& S, SElemType& e);
//插入元素e为新的栈顶元素
status Push_ Sq2(SqStack2& S, SElemType e);
//若栈不空,则用e返回s的栈顶元素,并返回0K;否则
返回ERROR
status GetTop_ Sq2(Sqstack2 S, SElemType& e);
//若栈S为空栈,则返回TRUE, 否则返回FALSE
status StackEmpty_ Sq2(SqStack2 S);
#include "allinclude.h"
void PostOrder(BiTree bt, void (*visit)(TElemType))
/* 使用栈,非递归后序遍历二叉树bt, */
/* 对每个结点的元素域data调用函数visit */
{ // Add your code here
SqStack2 S;
InitStack_Sq2(S);
SElemType p;
p.ptr=bt;
SElemType r;
r.ptr=NULL; //指向最近访问结点
while (p.ptr||!StackEmpty_Sq2(S))
{
if(p.ptr)
{
Push_Sq2(S,p); //向左走 并把其中都入栈
p.ptr=p.ptr->lchild;
}
else
{
GetTop_Sq2(S,p); //向左走到头后 取一栈顶元素
if(p.ptr->rchild&&r.ptr!=p.ptr->rchild) //然后看它是否有右孩子 若有右孩子且没被访问过 就往右走
{
p.ptr=p.ptr->rchild;
Push_Sq2(S,p); //以右孩子为根结点 接着向左走
p.ptr=p.ptr->lchild;
}
else //右子树走完了 走根节点
{
visit(p.ptr->data);
Pop_Sq2(S,p); //出栈
r.ptr=p.ptr;
p.ptr=NULL;
}
}
}
}