#include<bits/stdc++.h>
#define MAX 100
using namespace std;
int Count=0;
typedef struct tnode
{
char data;
struct tnode *lchild,*rchild;
}BT;
BT *CreateBTree()
{
BT *t;
char ch;
scanf("%c",&ch);
getchar();
if(ch=='0')
t=NULL;
else
{
t=(BT *)malloc(sizeof(BT));
t->data=ch;
printf("请输入%c结点的左孩子结点:",t->data);
t->lchild=CreateBTree();
printf("请输入%c结点的右孩子结点:",t->data);
t->rchild=CreateBTree();
}
return t;
}
void ShowBTree(BT *T)
{
if(T!=NULL)
{
printf("%c",T->data);
if(T->lchild!=NULL)
{
printf("(");
ShowBTree(T->lchild);
if(T->rchild!=NULL)
{
printf(",");
ShowBTree(T->rchild);
}
printf(")");
}
else if(T->rchild!=NULL)
{
printf("(");
ShowBTree(T->lchild);
if(T->rchild!=NULL)
{
printf(",");
ShowBTree(T->rchild);
}
printf(")");
}
}
}
//先序遍历
void PreOrder(BT *T)
{
if(T==NULL)
return;
else
{
printf("%c",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//中序遍历
void InOrder(BT *T)
{
if(T==NULL)
return;
else
{
InOrder(T->lchild);
printf("%c",T->data);
InOrder(T->rchild);
}
}
//后续遍历
void PostOrder(BT *T)
{
if(T==NULL)
return;
else
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c",T->data);
}
}
//层序遍历
LevelOrder(BT *T)
{
int r,f;
BT *p,*q[MAX];
p=T;
if(p!=NULL)
{
f=1,q[f]=p;r=2;
}
while(f!=r)
{
p=q[f];
printf("%c",p->data);
if(p->lchild!=NULL)
{
q[r]=p->lchild;
r=(r+1)%MAX;
}
if(p->rchild!=NULL)
{
q[r]=p->rchild;
r=(r+1)%MAX;
}
f=(f+1)%MAX;
}
}
//求叶子结点数目
void Leafnum(BT *T)
{
if(T)
{
if(T->lchild==NULL&&T->rchild==NULL)
Count++;
Leafnum(T->lchild);
Leafnum(T->rchild);
}
}
//求二叉树总结点数目
void Nodenum(BT *T)
{
if(T)
{
Count++;
Nodenum(T->lchild);
Nodenum(T->rchild);
}
}
//树的深度
int DepthBTree(BT *T)
{
int ldep=0,rdep=0;
if(T==0)
return 0;
else
{
ldep=DepthBTree(T->lchild);
rdep=DepthBTree(T->rchild);
if(ldep>=rdep)
return ldep+1;
else
return rdep+1;
}
}
void MenuTree()
{
printf("\n=========================================");
printf("\n| 1--建立一个新的二叉树 |");
printf("\n| 2--广义表表示法表示 |");
printf("\n| 3--先序遍历 |");
printf("\n| 4--中序遍历 |");
printf("\n| 5--后序遍历 |");
printf("\n| 6--层序遍历 |");
printf("\n| 7--求叶子结点数目 |");
printf("\n| 8--求二叉树总结点数目 |");
printf("\n| 9--树的深度 |");
printf("\n| 0--返回 |");
printf("\n=========================================");
printf("\n请输入菜单号(0-9):");
}
int main()
{
BT *T=NULL;
char ch1,ch2,a;
ch1='y';
while(ch1=='y'||ch1=='Y')
{
MenuTree();
scanf("%c",&ch2);
getchar();
switch(ch2)
{
case '0':
ch1='n';
break;
case '1':
printf("请按先序遍历输入二叉树结点\n");
printf("说明:输入结点后按回车键('0'表示后继结点为空)\n");
printf("请输入根结点:");
T=CreateBTree();
printf("二叉树成功建立!");
break;
case '2':
printf("二叉树广义表示法如下:");
ShowBTree(T);
break;
case '3':
printf("二叉树的先序遍历序列为:");
PreOrder(T);
break;
case '4':
printf("二叉树的中序遍历序列为:");
InOrder(T);
break;
case '5':
printf("二叉树的后序遍历序列为:");
PostOrder(T);
break;
case '6':
printf("二叉树的层序遍历序列为:");
LevelOrder(T);
break;
case '7':
Count=0;
Leafnum(T);
printf("二叉树有%d个叶子",Count);
break;
case '8':
Count=0;
Nodenum(T);
printf("该二叉树有%d个结点",Count);
break;
case '9':
DepthBTree(T);
printf("该树的深度为%d",DepthBTree(T));
break;
default:
printf("输入有误,请在1-9进行选择");
}
if(ch2!='0')
{
printf("\n按回车键继续,按任意键返回主菜单!");
a=getchar();
if(a!='\xA')
{
getchar();
ch1='n';
}
}
}
}