#include <stdio.h>
#include <stdlib.h>
#define max 50
typedef struct liuyu
{
    int data;
    struct liuyu *lchild,*rchild;
}test;
liuyu *root,*p,*q[max];
int sum=0;
int m=sizeof(test); 
int count = 0;          
void insert_data(int x)        
{ 
    liuyu *p,*q,*s;
    s=(test*)malloc(m);
    s->data=x;
    s->lchild=NULL;
    s->rchild=NULL;
    if(!root)
    {
        count++;
        root=s; 
    }
    p=root;           
    while(p)                 
    {
        q=p;
        if(p->data==x)
        {
            
            return;
        }
        else if(x<p->data)
            p=p->lchild;  
        else 
            p=p->rchild;
    }
    if(x < q->data)
        q->lchild=s;
    else 
        q->rchild=s;
    count++;
}
void MainUI()
{
    printf(" 欢迎进入二叉树的操作界面\n");
    printf("1. 数据输入\n");
    printf("2. 树的遍历\n");
    printf("3. 计算节点个数\n");
    printf("4. 按值查找\n");
    printf("5. 求树的深度\n");
    printf("请选择:");
}
void pre(liuyu *T)
{
    if(T)
    {
        printf("%d ",T->data);
        pre(T->lchild);
        pre(T->rchild);
    }
}
void center(liuyu *T)
{
    if(T)
    {
        center(T->lchild);
        printf("%d ",T->data);
        center(T->rchild);
    }   
}
void after(liuyu *T)
{
    if(T)
    {
    after(T->lchild);
    after(T->rchild);
        printf("%d ",T->data);
    }   
}
void insert()
{
    int i = 1, x;
    root=NULL; 
    do
    {
        printf("please input data%d:",i);
        i++;
        scanf("%d",&x);           
        if(x==-9999){ 
            printf("\n输入结束\n"); 
        }
        else 
            insert_data(x);     
    }        
    while(x!=-9999); 
}
void ShowTraverseResult()
{
    printf("先序遍历结果:");
    pre(root);
    printf("\n\n");
    printf("中序遍历结果:");
    center(root);
    printf("\n\n");
    printf("后序遍历结果:");
    after(root);
    printf("\n");
}
void ShowNodeDigit()
{
    printf("\n节点个数为:%d\n",count);
}
void FindValue(liuyu *T, int data)
{
    liuyu *p = T;
    while(p)
    {
        if(p->data == data)
        {
            printf("查找到了\n");
            return;
        }
        else if(p->data < data)
        {
            p = p->rchild;
        }
        else if(p->data > data)
        {
            p = p->lchild;
        }
    }
    printf("没找到\n");
    return;
}
int FindDeep(liuyu *T)
{
    int deep = 0;
    int lchilddeep, rchilddeep;
    if(T)
    {
        lchilddeep = FindDeep(T->lchild);
        rchilddeep = FindDeep(T->rchild);
        if(lchilddeep > rchilddeep)
        {
            deep = lchilddeep+1;
        }
        else
        {
            deep =  rchilddeep + 1;
        }
    }
    return deep;
}
void main()            
{
    int i,x, mainchoose;
    int data;
    i=1; 
    root=NULL;            
    while(1)
    {
    system("cls");
    MainUI();
    scanf("%d",&mainchoose);
        if(mainchoose == 1)
        {
            insert();
            printf("按任意键返回\n");
            fflush(stdin);
            getchar();
        }
        else if(mainchoose == 2)
        {
            ShowTraverseResult();
            printf("\n按任意键返回\n");
            fflush(stdin);
            getchar();
        }
        else if(mainchoose == 3)
        {
            ShowNodeDigit();
            printf("\n按任意键返回\n");
            fflush(stdin);
            getchar();
        }
        else if(mainchoose == 4)
        {
            printf("请输入要查找的值:");
            scanf("%d",&data);
            FindValue(root, data);
            printf("\n按任意键返回\n");
            fflush(stdin);
            getchar();
        }
        else if(mainchoose == 5)
        {
             printf("%d",FindDeep(root));
            printf("\n按任意键返回\n");
            fflush(stdin);
            getchar();
        }
    }
}