二叉排序树的定义:
- 左子树不为空时,则左子树上所有结点的值都小于它的根结点的值
- 右子树不为空时,则右子树上所有结点的值都大于它的根结点的值
- 它的左右字数也分别为二叉排序树(递归)
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//查找操作(递归实现)
/*
T是二叉查找树,key是要查找的值,
f是指向T的双亲,其初始值为NULL
p指向查找路径中访问的最后一个结点
*/
int Search(BiTree T,int key,BiTree f,BiTree *p)
{
if(NULL==T)
{
*p=f;
return 0; //没找到
}
if(key==T->data)
{
*p=T;
return 1; //找到了
}
if(key>T->data)
{
Search(T->rchild,key,T,p);
}
if(key<T->data)
{
Search(T->lchild,key,T,p);
}
}
//插入操作
int insert(BiTree *T,int key)
{
BiTree p,s;
if(Search(*T,key,NULL,&p))
{
return 0; //T中已经存在key了
}
else
{
s=(BiTree)malloc(sizeof(BiTNode));
s->data=key;
s->lchild=NULL;
s->rchild=NULL;
if(!p) //如果p是空就证明T是空的,所以让s成为根节点了
{
*T=s;
}
else if(key>p->data) //因为p是搜索的指向最后的一个结点,也就是离key要插入的位置最近的那一个结点
{
p->rchild=s;
}
else
{
p->lchild=s;
}
return 1;
}
}
//删除操作
int Delete(BiTree *T)
{
BiTree q,s;
if((*T)->lchild==NULL)
{
q=*T;
*T=(*T)->rchild;
free(q);
}
else if((*T)->rchild==NULL)
{
q=*T;
*T=(*T)->lchild;
free(q);
}
else
{
q=*T;
s=(*T)->lchild;
while(s->rchild) //找要删除的前驱结点,也就是要删除的结点里面最大的那个
{
q=s;
s=s->rchild;
}
(*T)->data=s->data;
if(q!=*T)
{
q->rchild=s->lchild;
}
else //当q和*T相等时,就证明T的前驱结点就是他的左边那个,也就是他左边那个没有右子树
{
q->lchild=s->lchild;
}
free(s);
}
return 1;
}
int DeleteBiT(BiTree *T,int key)
{
if(!T) //不存在key或者T是空的
{
return 0;
}
else
{
if(key==(*T)->data)
{
Delete(T);
}
else if(key>(*T)->data)
{
DeleteBiT(&(*T)->rchild,key);
}
else
{
DeleteBiT(&(*T)->lchild,key);
}
}
}
int main()
{
int array[]={46,67,70,105,100,99,103,104,115,110,108,112};
int i;
BiTree T=NULL,p;
int a,b,c;
for(i=0;i<12;i++)
{
insert(&T,array[i]);
}
printf("输入要查找的数,要插入的数,要删除的数:\n");
scanf("%d %d %d",&a,&b,&c);
Search(T,a,NULL,&p);
insert(&T,b);
DeleteBiT(&T,c);
return 0;