二叉排序树基本用法

#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)
        {
            //printf("data already exist! \n");
            return;
        }
        else if(x<p->data)
            p=p->lchild;  
        else 
            p=p->rchild;
    }//q是待插入结点的父节点
    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()//1 插入数据
{
    int i = 1, x;
    root=NULL; 
    do
    {
        printf("please input data%d:",i);
        i++;
        scanf("%d",&x);           /*从键盘采集数据,以-9999表示输入结束*/
        if(x==-9999){ 
            printf("\n输入结束\n"); 
        }
        else 
            insert_data(x);     /*调用插入数据元素的函数*/
    }        
    while(x!=-9999); 

}

void ShowTraverseResult()//2 显示遍历结果
{
    printf("先序遍历结果:");
    pre(root);
    printf("\n\n");
    printf("中序遍历结果:");
    center(root);
    printf("\n\n");
    printf("后序遍历结果:");
    after(root);
    printf("\n");
}

void ShowNodeDigit()//3 显示节点个数
{
    printf("\n节点个数为:%d\n",count);
}

void FindValue(liuyu *T, int data)//4 查找值
{
    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;            /*千万别忘了赋初值给root!*/
    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();
        }
    }
}
posted @ 2017-05-25 20:08  云胡同学  阅读(138)  评论(0编辑  收藏  举报