#include<stdio.h>
#include<stdlib.h>
typedef char datatype;
typedef struct BitNode
{
datatype data;
struct BitNode *lchild, *rchild;
}BT;
char sh = '0';
BT *create_tree()
{
BT *bt;
char x;
if (sh == '0')
{
printf("\n请按先序序列输入二叉树结点。'0'表示后继结点为空。\n请输入根结点: ");
sh = '1';
}
scanf("%c", &x);
getchar();
if (x == '0')
bt = NULL;
else
{
bt = (BT *)malloc(sizeof(BT));
bt->data = x;
printf("请输入%c结点的左结点: ", x);
bt->lchild = create_tree();
printf("请输入%c结点的右结点: ", x);
bt->rchild = create_tree();
}
return bt;
}
void preorder(BT *bt)
{
if (bt == NULL)
return;
printf("%c ", bt->data);
preorder(bt->lchild);
preorder(bt->rchild);
}
void inorder(BT *bt)
{
if (bt == NULL)
return;
inorder(bt->lchild);
printf("%c ", bt->data);
inorder(bt->rchild);
}
void postorder(BT *bt)
{
if (bt == NULL)
return;
postorder(bt->lchild);
postorder(bt->rchild);
printf("%c ", bt->data);
}
void levelorder(BT *bt)
{
if (bt == NULL)
return;
int i = 0,j = 1;
BT *str[100], *p;
str[0] = bt;
while (i != j)
{
p = str[i];
printf("%c ", p->data);
if (p->lchild != NULL)
{
str[j] = p->lchild;
j++;
}
if (p->rchild != NULL)
{
str[j] = p->rchild;
j++;
}
i++;
}
}
int num = 0;
void leafnum(BT *bt)
{
if (bt != NULL)
{
if (bt->lchild == NULL && bt->rchild == NULL)
num++;
leafnum(bt->lchild);
leafnum(bt->rchild);
}
}
void nodenumber(BT *bt)
{
if (bt != NULL)
{
num++;
nodenumber(bt->lchild);
nodenumber(bt->rchild);
}
}
int treedepth(BT *bt)
{
int ldep, rdep;
if (bt == NULL)
return 0;
else
{
ldep = treedepth(bt->lchild);
rdep = treedepth(bt->rchild);
if (ldep > rdep)
return ldep + 1;
else
return rdep + 1;
}
}
void caidan()
{
printf("\n\t\t 二叉树子系统 \n");
printf("\t\t***********************************************\n");
printf("\t\t* 1----建二叉树 *\n");
printf("\t\t* 2----先序遍历 *\n");
printf("\t\t* 3----中序遍历 *\n");
printf("\t\t* 4----后序遍历 *\n");
printf("\t\t* 5----层次遍历 *\n");
printf("\t\t* 6----求叶子数 *\n");
printf("\t\t* 7----求结点数 *\n");
printf("\t\t* 8----求树深度 *\n");
printf("\t\t* 0----返回 *\n");
printf("\t\t***********************************************\n");
}
int main()
{
while (1)
{
int ch;
BT *bt;
caidan();
printf("\n请选择菜单号<0-9>: ");
scanf("%d", &ch);
getchar();
switch(ch)
{
case 1:
bt = create_tree();
printf("二叉树建立成功。\n");
break;
case 2:
printf("二叉树先序遍历为: ");
preorder(bt);
break;
case 3:
printf("二叉树中序遍历为: ");
inorder(bt);
break;
case 4:
printf("二叉树后序遍历为: ");
postorder(bt);
break;
case 5:
printf("二叉树层次遍历为: ");
levelorder(bt);
break;
case 6:
num = 0;
printf("二叉树叶子数为: ");
leafnum(bt);
printf("%d\n", num);
break;
case 7:
num = 0;
printf("二叉树结点数为: ");
nodenumber(bt);
printf("%d\n", num);
break;
case 8:
printf("树的深度为:");
int dep = treedepth(bt);
printf("%d\n", dep);
break;
case 0:
printf("程序结束!\n");
return;
}
}
return 0;
}