#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_TREE_SIZE 100
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 0
#define ERROR 1
#define OVERFLOW -1
typedef char SElemType;
typedef char TElemType;
typedef int Status;
typedef struct BiTNode{ //創建樹的結構體
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree ;
typedef struct
{
BiTNode *base;
BiTNode *top;
int stacksize;
}SqStack;//資料結構的定義
Status InitStack(SqStack &S)//堆疊的初始化
{
S.base=(BiTNode *)malloc(STACK_INIT_SIZE*sizeof (BiTNode));
if(!S.base)
{
exit(OVERFLOW);
}
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return 0;
}
Status Push(SqStack &S,BiTNode &e)//進堆疊
{
if(S.top-S.base>=S.stacksize)
{
S.base=(BiTNode*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof (BiTNode));
{
exit(OVERFLOW);
}
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*(S.top)=e;
S.top++;
return 0;
}
Status Pop(SqStack &S,BiTNode &e)//出堆疊
{
if(S.top==S.base)
{
printf("堆疊為空!");
return ERROR;
}
e=*(--S.top);
return OK;
}
Status StackEmpty(SqStack &S)//判斷堆疊是否為空
{
if(S.top==S.base)
return 1;
else
return 0;
}
int CreateBiTree(BiTree &T) {
char ch;
getchar();
printf("請輸入二叉樹的元素\n");
scanf("%c",&ch);
if(ch=='#')T=NULL;
else {
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);
T->data=https://bbs.csdn.net/topics/ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
} //創建樹
void PreorderTraverse(BiTNode *T)//前序遍歷遞回
{
if(T!=NULL)
{
printf("%c",T->data);
PreorderTraverse(T->lchild);
PreorderTraverse(T->rchild);
}
}
//中序遞回遍歷
void PreorderTraverse2(BiTNode *T)
{
if(T!=NULL)
{
PreorderTraverse2(T->lchild);
printf("%c",T->data);
PreorderTraverse2(T->rchild);
}
}
//后序遞回遍歷
void PreorderTraverse3(BiTNode *T)
{
if(T!=NULL)
{
PreorderTraverse3(T->lchild);
PreorderTraverse3(T->rchild);
printf("%c",T->data);
}
}
void Preorder(BiTNode *T)
{
BiTNode t;
SqStack S;
InitStack(S);
while(T!=NULL||!StackEmpty(S))
{
if(T)
{
printf("%c",T->data);
Push(S,*T);
T=T->lchild;
}
if(!StackEmpty(S))
{
Pop(S,t);
T=&t;
T=T->rchild;
}
}
}
void Preorder2(BiTree &T)
{
SqStack S;
InitStack(S);
while(T!=NULL||!StackEmpty(S))
{
if(T)
{
Push(S,T);
T=T->lchild;
}
else
{
Pop(S,T->data);
printf("%c",T->data);
T=T->rchild;
}
}
} //非遞回中序遍歷
int main()
{
int a=1;
BiTNode *T;
while(a){
printf("\n請輸入你要的功能\n");
printf("--------------------\n");
printf("1:按前序遍歷規則創建二叉樹\n");
printf("2:前序遍歷二叉樹 T\n");
printf("3:中序遍歷二叉樹 T\n");
printf("4:后序遍歷二叉樹 T\n");
printf("5:非遞回前序遍歷 T\n");
printf("6:非遞回中序遍歷 T\n");
printf("0:exit!\n");
printf("--------------------\n");
scanf("%d",&a);
switch(a){
case 1:CreateBiTree(T);break;
case 2:PreorderTraverse(T);break;
case 3:PreorderTraverse2(T);break;
case 4:PreorderTraverse3(T);break;
case 5:Preorder(T);break;
case 6:Preorder2(T);break;
case 0:exit(-1);
}
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/87295.html
標籤:基礎類
上一篇:XE5 編譯GTK 的問題。哪里加引數 -mms-bitfields編譯
下一篇:slickedit
