<span style="font-size:18px;">栈中存放的为指针类型</span>
<span style="font-size:18px;">置空栈的时候要给指针所指向的地方分配空间</span>
<span style="font-size:18px;">因为栈中存放的为指针类型的地址 所以出栈是要运用二级指针 给*x 赋值</span>
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 30
typedef struct SNode
{
char x;
SNode *Lchild;
SNode *Rchild;
}BiTNode,* BiTree;
typedef struct
{
BiTNode *data[MAXSIZE];
int top;
}SeqStack;
SeqStack * init_SeqStack() //置空栈
{
SeqStack *s;
s=(SeqStack *)malloc(sizeof(SeqStack));
s->top=-1;
return s;
}
int Empty_SeqStack(SeqStack *s) //判空栈
{
if(s->top==-1)
return 1;
else
return 0;
}
int Push_SeqStack(SeqStack *s,BiTNode *p) //入栈
{
if(s->top==MAXSIZE-1)
return 0;
else
{
s->top++;
s->data[s->top]=p;
return 1;
}
}
int Pop_SeqStack(SeqStack *s,BiTNode **x) //出栈
{
if(Empty_SeqStack(s))
return 0;
else
{
*x=s->data[s->top--];
return 1;
}
}
BiTNode * Top_SeqStack(SeqStack *s) //取栈顶
{
if(Empty_SeqStack(s))
return 0;
else
return (s->data[s->top]);
}
/*BiTree creatBiTree() //有返回值的创建树 调用一级指针
{
BiTree root;
char ch;
ch=getchar();
if(ch=='#')
root=NULL;
else
{
root=(BiTree)malloc(sizeof(BiTNode));
root->x=ch;
root->Lchild=creatBiTree();
root->Rchild=creatBiTree();
}
return root;
}
*/
void creatBiTree(BiTree *root) //(引用二级指针 无返回值 传递的为*root的地址 相当于在这个函数中root存的
{ //是传来root的地址 而*root则为传来的root)
char ch;
ch=getchar();
if(ch=='#')
(*root)=NULL;
else
{
*root=(BiTree)malloc(sizeof(BiTNode));
(*root)->x=ch;
creatBiTree(&((*root)->Lchild));
creatBiTree(&((*root)->Rchild));
}
}
void PreOrder(BiTree root) //先序非递归遍历二叉树
{
SeqStack *s;
s=init_SeqStack();
BiTree p;
p=root;
while(p!=NULL||!Empty_SeqStack(s))
{
while(p!=NULL)
{
printf("%4c",p->x);
Push_SeqStack(s,p);
p=p->Lchild;
}
if(!Empty_SeqStack(s))
{
Pop_SeqStack(s,&p);
p=p->Rchild;
}
}
}
void InOrder(BiTree root) //中序非递归遍历二叉树
{
SeqStack *s;
s=init_SeqStack();
BiTree p;
p=root;
while(p!=NULL||!Empty_SeqStack(s))
{
if(p!=NULL)
{
Push_SeqStack(s,p);
p=p->Lchild;
}
else
{
Pop_SeqStack(s,&p);
printf("%4c",p->x);
p=p->Rchild;
}
}
}