#include<stdio.h>
#include<stdlib.h>
#define M 100
#define ERROR 0
#define FALSE 0
#define TURE 1
#define OK 1
typedef int status;
typedef struct Bitree
{
char data;
struct Bitree *lchild, *rchild;
}Bitree,*bitree;
typedef struct
{
bitree a[M];
int top ;
}stack;
status InitStack(stack *s)//初始化栈
{
s->top = 0;
return OK;
}
status PushStack(stack *s,bitree *T)//进栈操作
{
if (s->top > 100)
{
return ERROR;
}
s->a[++s->top] = (*T);
return OK;
}
status PopStack (stack *s, bitree *T)//出栈操作
{
if ( s->top == 0)
{
return ERROR;
}
(*T) = s->a[s->top--];
return OK;
}
status EmptyStack(const stack *s)//判断是否为空
{
if ( s->top == 0)
{
return TURE;
}
else
{
return FALSE;
}
}
status CreatBitree(bitree *T)//建树
{
char ch;
printf("请输入字符:");
scanf("%c",&ch);
getchar();
printf("/n");
if ( ch == ' ')
{
(*T) = NULL;
return 0;
}
else
{
(*T) = (bitree)malloc(sizeof(Bitree));
if(*T==NULL)
{
printf("memory allocation failed ,Goodbye");
exit(1);
}
(*T)->data = ch;
CreatBitree(&(*T)->lchild);
CreatBitree(&(*T)->rchild);
}
return OK;
}
status PreOrderTraverse( bitree *T)//前序遍历
{
stack s;
InitStack(&s);
while ((*T) != NULL || !EmptyStack(&s))
{
while (*T)
{
printf("%c",(*T)->data);
PushStack(&s,&(*T));
(*T) = (*T)->lchild;
}
if (!EmptyStack(&s))
{
PopStack(&s,&(*T));
(*T) = (*T)->rchild;
}
}
return OK;
}
status InorderTraverse( bitree *T)//中序遍历
{
stack s;
InitStack(&s);
while((*T) != NULL || !EmptyStack(&s))
{
while (*T)
{
PushStack(&s,&(*T));
(*T) = (*T)->lchild;
}
if (!EmptyStack(&s))
{
PopStack(&s,&(*T));
printf("%c",(*T)->data);
(*T) = (*T)->rchild;
}
}
return OK;
}
status BefororderTraverse(bitree *T)//后序遍历
{
int flag = 0;
stack s;
InitStack(&s);
while((*T) != NULL || !EmptyStack(&s))
{
while (*T)
{
PushStack(&s,&(*T));
(*T) = (*T)->lchild;
flag = 0;
}
if (!EmptyStack(&s) && flag == 1)
{
printf("%c",(*T)->data);
}
if (!EmptyStack(&s))
{
PopStack(&s,&(*T));
(*T) = (*T)->rchild;
flag = 1;
}
}
return OK;
}
int main(void)
{
bitree T;
int select ;
CreatBitree(&T);
do
{
printf("1: 进行前序遍历/n");
printf("2: 进行中序遍历/n");
printf("3: 进行后序遍历/n");
printf("请选择:");
scanf("%d",&select);
}while( select < 1 || select > 4);
switch(select)
{
case 1:
printf("前序遍历:");
PreOrderTraverse(&T);
printf("/n");
break;
case 2:
printf("/n中序遍历");
InorderTraverse(&T);
printf("/n");
break;
case 3:
printf("/n后序遍历");
BefororderTraverse(&T);
printf("/n");
default:
break;
}
system("pause");
return 0;
}
后序遍历还有点问题
本文介绍了一种使用栈实现二叉树前序、中序和后序遍历的方法,并提供了完整的C语言代码示例。文章详细解释了每种遍历方式的实现逻辑。

214

被折叠的 条评论
为什么被折叠?



