试利用栈的基本操作,写出后序遍历的非递归算法。

试利用栈的基本操作,写出后序遍历的非递归算法。
(提示:为分辨后序遍历时两次进栈的不同返回点,需在指
针进栈时同时将一个标志进栈)。
要求实现下列函数: 
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;
        }
         
      }
   }
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值