一、二叉树的结构体结构
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