利用棧中序遍歷二叉樹
#include"stdlib.h"
#include"stdio.h"
#include"iostream.h"
//***********二叉樹的遍歷***********
typedef char TElemType;
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//typedef int SElemType;
typedef int Status;
//定義二叉樹及結點結構
typedef struct BiTNode
{
TElemType data;
//int IsVisit;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef BiTree SElemType;
//定義順序棧的結構;
typedef struct SqStack
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//初始化一個空棧;
Status InitStack(SqStack *S)
{
(*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW);
(*S).top = (*S).base;
(*S).stacksize = STACK_INIT_SIZE;
return OK;
}
//資料元素入棧;
Status Push(SqStack *S,SElemType e)
{
if((*S).top-(*S).base >=(*S).stacksize) //增大空間
{
(*S).base = (SElemType *)realloc((*S).base,
((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW);
(*S).top = (*S).base+(*S).stacksize;
(*S).stacksize += STACKINCREMENT;
}
*((*S).top)++ = e;
return OK;
}
//資料元素出棧;
Status Pop(SqStack *S,SElemType *e)
{
if((*S).top == (*S).base)
return ERROR;
*e = *--(*S).top;
return OK;
}
//判斷一個棧是否為空;
Status StackEmpty(SqStack S)
{
if (S.top == S.base)
return true;
else
return FALSE;
}
//銷燬一個棧;
Status DestroyStack(SqStack *S)
{
free((*S).base);
(*S).base = NULL;
(*S).top = NULL;
(*S).stacksize = 0;
return OK;
}
//取棧頂的資料元素;
Status GetTop(SqStack S,SElemType *e)
{
if(S.top>S.base)
{
*e = *(S.top - 1);
return OK;
}
else
return ERROR;
}
//建立一棵空的二叉樹
Status InitBiTree(BiTree *T)
{
*T = NULL;
return OK;
}
//銷燬二叉樹
void DestroyBiTree(BiTree *T)
{
if(*T)
{
if((*T)->lchild)
DestroyBiTree(&(*T)->lchild);
if((*T)->rchild)
DestroyBiTree(&(*T)->rchild);
free(*T);
*T = NULL;
}
}
//構造一棵二叉樹
void CreateBiTree(BiTree *T)
{
TElemType ch;
InitBiTree(T);
cin>>ch;
if(ch == '0')
T = NULL;
else
*T = (BiTree)malloc(sizeof(BiTNode));
if(!(T))
return;
(*T)->data = ch;
//(*T)->IsVisit = 1;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
//輸出二叉樹的結點
Status visitT(TElemType e)
{
printf("%c",e);
return OK;
}
//利用棧對二叉樹進行中序遍歷
Status StackInOrderVisit(BiTree T,Status(*Visit)(TElemType))
{
SqStack S;
InitStack(&S);
Push(&S,T);
while(S.base != S.top)
{
//while(T->lchild && (*T).IsVisit == 1)
while(T->lchild)
{
T = T->lchild;
Push(&S,T);
//T->IsVisit = 0;
}
Pop(&S,&T);
Visit(T->data);
if(T->rchild)
{
T = T->rchild;
Push(&S,T);
}
}
return OK;
}
//主函式
void main()
{
BiTree T;
printf("先序建立一棵樹:\n");
cout<<"請輸入一個結點(0表示為空)"<<endl;
CreateBiTree(&T); //線序建立二叉樹
StackInOrderVisit(T,visitT); //中序遍歷二叉樹
printf("\n");
DestroyBiTree(&T);
}
//執行結果:
先序建立一棵樹:
請輸入一個結點(0表示為空)
dba00c00fe00g00
abcdefg