<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;
}
}
}