/**********
【题目】试利用栈及其基本操作写出二叉树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 */
{
Stack S;
SElemType e;
InitStack(S);
while(!StackEmpty(S) || T != NULL){
while(T != NULL){
e.ptr = T;
e.tag = 0;
Push(S,e);
T = T->lchild;
}
Pop(S,e);
T = e.ptr;
if(e.tag == 0 && T -> rchild != NULL){
e.tag = 1;
Push(S,e);
T = T -> rchild;
}else if(e.tag == 1 || T -> rchild == NULL){
visit(T->data);
T = NULL;
}
}
}
带tag的二叉树非递归遍历
最新推荐文章于 2021-11-07 21:53:05 发布