1. 程式人生 > >利用棧中序遍歷二叉樹

利用棧中序遍歷二叉樹

//線序建立二叉樹,然後利用棧中序遍歷 

#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