二叉排序树创建、查找、删除

来源:互联网 发布:sql数据库存储过程 编辑:程序博客网 时间:2024/06/05 18:04

一、二叉树的结构体结构

typedef struct tree{    int date;    tree *lchild;    tree *rchild;}tr_t;

二、二叉排序树的创建

void creat_BStree(tr_t ** tr,int num){    if ((*tr) == NULL)    {        (*tr) = (tree*)malloc(sizeof(tree));        (*tr)->date = num;        (*tr)->lchild = NULL;        (*tr)->rchild = NULL;    }    else if(num < (*tr)->date)        creat_BStree(&((*tr)->lchild), num);    else if(num >(*tr)->date)        creat_BStree(&((*tr)->rchild), num);}

三、二叉排序数的查找

tr_t * search_BStree(tr_t *tr,int date){    if (tr != NULL)    {        if (tr->date == date)        {            return tr;        }        else if (tr->date > date)        {            return search_BStree(tr->lchild, date);        }        else if(tr->date<date)        {            return search_BStree(tr->rchild, date);        }    }    else    {        tr_t *t = (tr_t*)malloc(sizeof(tr_t));        t->lchild = NULL;        t->rchild = NULL;        t->date = 0;        return t;    }}

四、二叉排序树的删除

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

tr_t * delete_tr(tr_t *tr,int date){    if (tr != NULL)    {        //找到该节点        tr_t *p;        tr_t *f;        f = NULL;        p = tr;        while(p)        {            if (p->date == date)            {                break;            }            f = p;            if (p->date < date)                p = p->rchild;            else                p = p->lchild;        }        if (p == NULL)        {            return tr;        }        //如果将要删除的点 没有左孩子        if (p->lchild == NULL)        {            if (f == NULL)//如果删除的是根节点                tr = p->rchild;            if (f->lchild == p)            {                f->lchild = p->rchild;            }            else if (f->rchild == p)            {                f->rchild = p->rchild;            }            free(p);        }        else//如果有左孩子        {            //找到前驱            tr_t *q;            tr_t *s;            p = s = NULL;            q = p;            s = p->lchild;            while (s)            {                q = s;                s = s->rchild;            }            if (p==q)            {                p->lchild = s->lchild;            }            else            {                q->rchild = s->lchild;            }            p->date = s->date;            free(s);        }        return tr;    }}

五、源代码

#include<stdio.h>#include<stdlib.h>#define MAX 20#if 1//二叉排序树的创建、查找、删除typedef struct tree{    int date;    tree *lchild;    tree *rchild;}tr_t;void creat_BStree(tr_t ** tr,int num){    if ((*tr) == NULL)    {        (*tr) = (tree*)malloc(sizeof(tree));        (*tr)->date = num;        (*tr)->lchild = NULL;        (*tr)->rchild = NULL;    }    else if(num < (*tr)->date)        creat_BStree(&((*tr)->lchild), num);    else if(num >(*tr)->date)        creat_BStree(&((*tr)->rchild), num);}//中序遍历输出void print(tr_t *tr){    if (tr != NULL)    {        print(tr->lchild);        printf("%d  ",tr->date);        print(tr->rchild);    }}//查找tr_t * search_BStree(tr_t *tr,int date){    if (tr != NULL)    {        if (tr->date == date)        {            return tr;        }        else if (tr->date > date)        {            return search_BStree(tr->lchild, date);        }        else if(tr->date<date)        {            return search_BStree(tr->rchild, date);        }    }    else    {        tr_t *t = (tr_t*)malloc(sizeof(tr_t));        t->lchild = NULL;        t->rchild = NULL;        t->date = 0;        return t;    }}//删除一个结点tr_t * delete_tr(tr_t *tr,int date){    if (tr != NULL)    {        //找到该节点        tr_t *p;        tr_t *f;        f = NULL;        p = tr;        while(p)        {            if (p->date == date)            {                break;            }            f = p;            if (p->date < date)                p = p->rchild;            else                p = p->lchild;        }        if (p == NULL)        {            return tr;        }        //如果将要删除的点 没有左孩子        if (p->lchild == NULL)        {            if (f == NULL)//如果删除的是根节点                tr = p->rchild;            if (f->lchild == p)            {                f->lchild = p->rchild;            }            else if (f->rchild == p)            {                f->rchild = p->rchild;            }            free(p);        }        else//如果有左孩子        {            //找到前驱            tr_t *q;            tr_t *s;            p = s = NULL;            q = p;            s = p->lchild;            while (s)            {                q = s;                s = s->rchild;            }            if (p==q)            {                p->lchild = s->lchild;            }            else            {                q->rchild = s->lchild;            }            p->date = s->date;            free(s);        }        return tr;    }}int main(void){    tr_t *tr;    tr = NULL;    int num = 0;    scanf("%d", &num);    while (num != -1)    {        creat_BStree(&tr, num);        scanf("%d", &num);    }    print(tr);    printf("\n");    tr_t *p = search_BStree(tr ,30);    printf("%d\n",p->date);    delete_tr(tr,20);    print(tr);    printf("\n");    return 0;}#endif
原创粉丝点击