#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define OVERFLOW 0
#define max 50
typedef struct
{
char a[max];
int top;
}seqstack;
seqstack *s=(seqstack *)malloc(sizeof(seqstack)); /*建立栈*/
typedef struct Bitree /*结构体存放结点信息以及左右孩子结点指针*/
{
char data;
struct Bitree *lchild;
struct Bitree *rchild;
}Bitree,*Binarytree;
void initstack(seqstack *s) /*初始化栈*/
{
s->top=-1;
}
int push(seqstack *s,char x) /*入栈*/
{
if(s->top==max-1)return 0;
s->top++;
s->a[s->top]=x;
return 1;
}
int pop(seqstack *s) /*出栈*/
{
if(s->top==-1)return 0;
else
{s->top--;
return 1;
}
}
int createbitree(Binarytree *T) /*构造二叉树*/
{
char ch;
*T=(Binarytree)malloc(sizeof(Bitree));
if(!(*T))
exit(OVERFLOW);
scanf("%c",&ch);
if(ch=='0') /*输入为0时不建立新结点*/
*T=NULL;
else
{
(*T)->data=ch; /*输入不为0时建立新结点*/
createbitree(&((*T)->lchild)); /*递归建立左子树和右子树*/
createbitree(&((*T)->rchild));
}
return OK;
}
int preshowbitree(Binarytree T) /*先序遍历*/
{
if(T!=NULL)
{
printf("%c ",T->data); /*该结点不为空时打印*/
preshowbitree(T->lchild); /*递归遍历左子树*/
preshowbitree(T->rchild); /*递归遍历右子树*/
}
return OK;
}
int midshowbitree(Binarytree T)
{
if(T!=NULL)
{
midshowbitree(T->lchild); /*递归遍历左子树*/
printf("%c ",T->data); /*该结点不为空时打印*/
midshowbitree(T->rchild); /*递归遍历右子树*/
}
return OK;
}
int behshowbitree(Binarytree T)
{
if(T!=NULL)
{
behshowbitree(T->lchild); /*递归遍历左子树*/
behshowbitree(T->rchild); /*递归遍历右子树*/
printf("%c ",T->data); /*该结点不为空时打印*/
}
return OK;
}
int layershowbitree(Binarytree T,int nowlayer,int layer) /*层序遍历*/
{
if(T!=NULL)
{
if(nowlayer==layer) /*当结点在所求的层数时打印该结点*/
printf("%c ",T->data);
layershowbitree(T->lchild,nowlayer+1,layer); /*递归遍历左子树*/
layershowbitree(T->rchild,nowlayer+1,layer); /*递归遍历右子树*/
}
return OK;
}
void findpath(Binarytree T,seqstack *s,char x) /*寻找从根结点到所求结点的路径*/
{
if(T==NULL)return;
push(s,T->data); /*遍历到某结点将结点数据入栈*/
if(T->data==x) /*如果该结点为所求结点,则打印栈中的数据并退出程序*/
{
for(int i=0;i<=s->top;i++)
printf("%c ",s->a[i]);
exit(0);
}
findpath(T->lchild,s,x); /*遍历左子树寻找所求结点*/
findpath(T->rchild,s,x); /*遍历右子树寻找所求结点*/
pop(s); /*左右子树中都没有该结点,将该结点出栈,返回上一层*/
}
int main()
{
int m;
printf("菜单:\n");
printf("1.建立二叉树存储结构\n2.求二叉树的先序遍历序列\n3.求二叉树的中序遍历序列\n4.求二叉树的后序遍历序列\n5.求二叉树的层序遍历序列\n6.求根结点到指定结点的路径\n0.退出\n请选择:\n");
Bitree *T=NULL;
while(scanf("%d",&m)&&m)
{
fflush(stdin);
switch(m)
{
case 0:exit(0);
case 1:
printf("请按照先序遍历输入二叉树:\n");
createbitree(&T);
printf("二叉树建立完成");
break;
case 2:
printf("二叉树的先序遍历序列为:\n");
preshowbitree(T);
break;
case 3:
printf("二叉树的中序遍历序列为:\n");
midshowbitree(T);
break;
case 4:
printf("二叉树的后序遍历序列为:\n");
behshowbitree(T);
break;
case 5:
printf("请输入要查看的层数:\n");
int l;
scanf("%d",&l);
printf("第%d层的结点有:\n",l);
layershowbitree(T,1,l);
break;
case 6:
printf("请输入要查看的结点:\n");
fflush(stdin);
char e;
scanf("%c",&e);
initstack(s);
printf("路径为:\n");
findpath(T,s,e);
break;
default:printf("输入错误");break;
}
printf("\n");
}
return 0;
}