第5章 树与二叉树
5.3 二叉树的遍历和线索二叉树
综合应用题 第3题
#include <stdio.h>
#include <stdlib.h> //malloc所在头文件
#include <iostream>
#define MaxSize 100
using namespace std;
typedef int ElemType;
typedef struct BiTNode{//声明树
ElemType data; //数据域
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
typedef struct {//声明栈
BiTNode* stack[MaxSize];
int top;
}SqStack;
void InitStack(SqStack &S)//初始化栈
{
S.top=-1;
}
int Push(SqStack &S,BiTNode* x)//入栈
{
if(S.top==MaxSize-1)
{
cout<<"栈满"<<endl;
exit(0);
}
S.stack[++S.top]=x;
// cout<<"i"<<endl;
return 1;
}
int Pop(SqStack &S,BiTNode* x)//出栈
{
if(S.top==-1)
{
cout<<"栈空"<<endl;
return 0;
}
x=S.stack[S.top--];
// cout<<"o"<<endl;
return 1;
}
BiTNode* GetTop(SqStack &S)//出栈
{
BiTNode* s;
if(S.top==-1)
{
cout<<"栈空"<<endl;
return 0;
}
s=S.stack[S.top];
// cout<<"g"<<endl;
return s;
}
void PrintStack(SqStack S) //输出栈
{
while(S.top!=-1)
{
cout<<S.stack[S.top]<<" ";
S.top--;
}
cout<<endl;
}
bool StatckEmpty(SqStack &S)//判断栈是否为空
{
if(S.top==-1)
return true;
else
return false;
}
//初始化
bool InitBiTree(BiTree &B){
B=NULL;
return true;
}
//建立
BiTree BiTreeCreatT(ElemType *a,BiTree &B) {
InitBiTree(B); //初始化一个空链表
B=(BiTree)malloc(sizeof(BiTNode));
B->lchild=NULL;
B->rchild=NULL;
B->data=a[0];
BiTNode *p,*s;
s=B;
p = (BiTNode *)malloc(sizeof(BiTNode)); //申请新的结点
p->data = a[1];
p->lchild=NULL;
p->rchild=NULL;
s->lchild=p;
p = (BiTNode *)malloc(sizeof(BiTNode)); //申请新的结点
p->data = a[2];
p->lchild=NULL;
p->rchild=NULL;
s->rchild=p;
s=s->lchild;
p = (BiTNode *)malloc(sizeof(BiTNode)); //申请新的结点
p->data = a[3];
p->lchild=NULL;
p->rchild=NULL;
s->lchild=p;
p = (BiTNode *)malloc(sizeof(BiTNode)); //申请新的结点
p->data = a[4];
p->lchild=NULL;
p->rchild=NULL;
s->rchild=p;
return B;
}
void PostOrder(BiTree T,SqStack &S)//非递归后序遍历
{
BiTNode *p=T,*r=NULL;
while(p||!StatckEmpty(S))
{
if(p)
{
Push(S,p);
p=p->lchild;
}
else
{
p=GetTop(S);
if(p->rchild&&p->rchild!=r)
p=p->rchild;
else{
Pop(S,p);
cout<<p->data;
r=p;
p=NULL;
}
}
}
}
int main() {
int a[5]={4,2,5,1,3};
BiTree B;
BiTreeCreatT(a,B);
SqStack S;
InitStack(S);
cout<<"非递归后序遍历:";
PostOrder(B,S);
return 0;
}