6-1 栈及二叉树的非递归遍历(c++)

该博客介绍了如何使用C++实现非递归方式遍历二叉树,包括先序、中序和后序遍历。通过顺序栈来辅助操作,详细展示了各遍历方法的代码实现,并提供了测试用例。同时,博客中还记录了入栈和出栈的次数,以便分析遍历过程。
摘要由CSDN通过智能技术生成

6-1 栈及二叉树的非递归遍历(c++)
在这里描述函数接口:
#include
#define MAXSIZE 100 //顺序栈存储控件的初始分配量
#define OK 1
#define ERROR 0
#define OVERFLOW -1
using namespace std;
typedef int Status;
typedef char TElemType;
typedef struct BiTNode{
TElemType Data;
struct BiTNode *lchild,*rchild;
int flag;//用于非递归后序遍历
}BiTNode,*BiTree;

static int pushCount = 0; //用于统计入栈的次数
static int popCount = 0; //用于统计出栈的次数

/------------------------顺序栈的定义---------------------/
typedef BiTNode* SElemType;//栈中存储的是结点的指针而非结点本身
typedef struct{
SElemType *base;//栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用的最大容量
}SqStack;

/*栈的实现 /
//下面两个函数由裁判程序实现,无需再写
Status Push(SqStack &S,SElemType e);/元素e入栈/
Status Pop(SqStack &S,SElemType &e);/
删除并仅返回S的栈顶元素 */

//下面三个函数请提供实现代码
Status InitStack(SqStack &S); /栈初始化 /
SElemType GetTop(SqStack S); /
仅返回S的栈顶元素 /
bool stackEmpty(SqStack S); /栈是否为空,为空则返回true,否则返回false/
/
--------------------------堆栈的定义结束------------------
/

//下面三个函数请提供实现代码
void CreateBiTree(BiTree& BT);//先序遍历的顺序建立二叉链表
void InorderTraverse( BiTree BT );//非递归中序遍历
void PreorderTraverse( BiTree BT );//非递归先序遍历
//下面函数由裁判程序实现,无需提供实现代码
void PostorderTraverse( BiTree BT );//非递归后序遍历
void TestStack();
void CreateBiTree1(BiTree& BT);
在这里给出函数被调用进行测试:
int main()
{
BiTree BT;
int mode ;
cin>>mode;
switch(mode){
case 0: //测试栈的相关函数定义
TestStack();break;
case 1: //测试CreateBiTree()函数
CreateBiTree(BT);
cout<<“Postorder:”;
PostorderTraverse(BT);
cout<<endl;
break;
case 2: //测试PreorderTraverse()函数
CreateBiTree1(BT);
pushCount = popCount = 0;
cout<<“Preorder:”; PreorderTraverse(BT); cout<<endl;
cout<<“pushCount:”<<pushCount<<endl;
cout<<“popCount:”<<popCount<<endl;
break;
default: //测试InorderTraverse()函数
CreateBiTree1(BT);
pushCount = popCount = 0;
cout<<“Inorder:”; InorderTraverse(BT); cout<<endl;
cout<<“pushCount:”<<pushCount<<endl;
cout<<“popCount:”<<popCount<<endl;
}
return 0;
}
/* 请在这里填写答案 */
Status InitStack(SqStack& S)
{
S.base = new SElemType[MAXSIZE];
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}/*栈初始化 */
SElemType GetTop(SqStack S)
{
if (S.top != S.base)
{
return *(S.top - 1);
}

}/* 仅返回S的栈顶元素 */
bool stackEmpty(SqStack S)
{
if (S.base == S.top)
{
return true;
}
else
{
return false;
}

}/栈是否为空,为空则返回true,否则返回false/
void CreateBiTree(BiTree& BT)//根左右
{
char ch;
cin >> ch;
if (ch == ‘#’) BT = NULL;
else
{
BT = new BiTNode;
BT->Data = ch;
CreateBiTree(BT->lchild);
CreateBiTree(BT->rchild);
}

}//先序遍历的顺序建立二叉链表
void InorderTraverse(BiTree BT)//左根右
{
BiTree p,q;
SqStack S;
InitStack(S); p = BT;
q = new BiTNode;
while (p || !stackEmpty(S))
{
if § {
Push(S, p);
p = p->lchild;
}
else
{
Pop(S, q);
cout << q->Data;
p = q->rchild;
}
}

}//非递归中序遍历
void PreorderTraverse(BiTree BT)
{
BiTree p, q;
SqStack S;
InitStack(S); p = BT;
q = new BiTNode;
while (p || !stackEmpty(S))
{
if § {

        cout << p->Data;//访问根节点 
        Push(S, p);
        p=p->lchild;//遍历左子树
    }
    else
    {
        Pop(S, q);
        p = q->rchild;//遍历右子树
    }
}

}//非递归先序遍历

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值