#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define STACK_INIT_SIZE 50
typedef int Status;
typedef float ElemType;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
Status CreatBiTreeNode(BiTree &T)
{
char ch;
ch=getchar();//scanf("%c",&ch);
if(ch==' ')T=NULL;
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
CreatBiTreeNode(T->lchild);
CreatBiTreeNode(T->rchild);
}
return OK;
}
void PreOrder(BiTree T)
{
if(T)
{
printf("%c",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree T)
{
if(T)
{
InOrder(T->lchild);
printf("%c",T->data);
InOrder(T->rchild);
}
}
void PostOrder(BiTree T)
{
if(T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c",T->data);
}
}
typedef struct
{
BiTree *base;
BiTree *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{
s.base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTree));
if(!s.base)exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
Status GetTop(SqStack s,BiTree &e)
{
if(s.top==s.base)return ERROR;
e=*(s.top-1);
return OK;
}
Status Push(SqStack &s,BiTree e)
{
if((s.top-s.base)>=s.stacksize)
{
printf("内存不足!\n");
return ERROR;
}
*(s.top++)=e;
return OK;
}
Status Pop(SqStack &s)
{
BiTree e;
if(s.top==s.base)return ERROR;
e=*(--s.top);
return OK;
}
int StackEmpty(SqStack S)
{
if(S.top==S.base)return ERROR;
else return OK;
}
void InOrder2(BiTree T)
{
SqStack S;
InitStack(S);
BiTree p=T;
while((NULL!=p)||StackEmpty(S))
{
if(NULL!=p)
{
Push(S,p);
p=p->lchild;
}
else
{
GetTop(S,p);
Pop(S);
printf("%c",p->data);
p=p->rchild;
}
}
}
int GetTreeDeep(BiTree T)
{
if(T==NULL)return ERROR;
else
{
int a=GetTreeDeep(T->lchild);
int b=GetTreeDeep(T->rchild);
return (a>b)?(a+1):(b+1);
}
}
int GetTreeNodeCount(BiTree T)
{
if (T==NULL)return ERROR;
int leftCount=GetTreeNodeCount(T->lchild);
int rightCount=GetTreeNodeCount(T->rchild);
int ret=leftCount+rightCount+1;
return ret;
}
void menu()
{
printf("****************************\n");
printf("请输入菜单选项: *\n");
printf("1 先序创建二叉树 *\n");
printf("0 退出系统 *\n");
printf("****************************\n");
}
void menu1()
{
printf("****************************\n");
printf("请输入菜单选项: *\n");
printf("0 退出系统 *\n");
printf("1 先序遍历二叉树 *\n");
printf("2 中序遍历二叉树 *\n");
printf("3 后序遍历二叉树 *\n");
printf("4 求二叉树的高度 *\n");
printf("5 求二叉树结点数 *\n");
printf("****************************\n");
}
void menu2()
{
printf("****************************\n");
printf("请输入菜单选项: *\n");
printf("0 退出系统 *\n");
printf("1 递归算法 *\n");
printf("2 非递归算法 *\n");
printf("****************************\n");
}
main()
{
int flag,flog,fleg,n;
BiTree T;
printf("****欢迎使用二叉树处理器****\n");
while(1)
{
menu();
scanf("%d",&flag);
getchar();
switch(flag)
{
case 0:printf("正在退出,请稍候");
printf(".");
printf(".");
printf(".");
system("cls");
printf("********欢迎下次使用********\n");
return 0;
case 1:printf("请按先序次序输入二叉树结点的值(一个字符),用空格表示空树:\n");
CreatBiTreeNode(T);
while(1)
{
menu1();
scanf("%d",&flog);
getchar();
switch(flog)
{
case 0: printf("正在退出,请稍候");
printf(".");
printf(".");
printf(".");
system("cls");
printf("********欢迎下次使用********\n");
return 0;
case 1:PreOrder(T);
printf("\n");
break;
case 2:menu2();
scanf("%d",&n);
if(n==0)
{
printf("正在退出,请稍候");
printf(".");
printf(".");
printf(".");
system("cls");
printf("********欢迎下次使用********\n");
return 0;
}
else if(n==1){InOrder(T);printf("\n");}
else if(n==2){InOrder2(T);printf("\n");}
else printf("输入错误!");
break;
case 3:PostOrder(T);
printf("\n");
break;
case 4:printf("%d",GetTreeDeep(T));
printf("\n");
break;
case 5:printf("%d",GetTreeNodeCount(T));
printf("\n");
break;
}
}
break;
}
}
}
简单的二叉树遍历系统
最新推荐文章于 2024-08-18 14:45:23 发布