二叉排序树基本用法

来源:互联网 发布:java线程yield 编辑:程序博客网 时间:2024/06/04 18:28
#include <stdio.h>#include <stdlib.h>#define max 50typedef 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();        }    }}
原创粉丝点击