#include<stdio.h>
#include<stdlib.h>
typedef struct _BinTree
{
int data;
struct _BinTree* lchild;
struct _BinTree* rchild;
}BinNode;
typedef struct _BinTree* BinTree;
void Insert(BinTree* T,int data)
{
if(!(*T))//没有分配
{
(*T) = (struct _BinTree*)malloc(sizeof(struct _BinTree));
(*T)->data = data;
(*T)->lchild = NULL;
(*T)->rchild = NULL;
return;
}
if((*T)->data == data)//已经含有数据
return;
if((*T)->data < data)//否则。
Insert(&(*T)->rchild,data);
else
Insert(&(*T)->lchild,data);
}
BinTree Find(BinTree T,int data)
{
if(!T)//没找到
return NULL;
if(T->data < data)//元素大,往右找
return Find(T->rchild,data);
else if(T->data > data)//元素小,往左找
return Find(T->lchild,data);
else
return T;
}
void Delete(BinTree* T)//要对元素操作,必须传递指针
{
BinTree q,s;
if((*T)->rchild == NULL)//右子树空
{
q = (*T);
(*T) = (*T)->lchild;
free(q);
}
else if((*T)->lchild == NULL)//左子树空
{
q = (*T);
(*T) = (*T)->rchild;
free(q);
}
//上述就包含了左右子树都为空的情况,下面就是左右子树都不为空的情况
else
{
q = (*T);
s = (*T)->lchild;
while(s->rchild)
{
q = s;//前驱
s = s->rchild;
}
//上面查找完,s肯定没右孩子,也就是s为最右孩子,q为s的父亲
(*T)->data = s->data;
if(q != (*T))
q->rchild = s->lchild;
else
q->lchild = s->lchild;
free(s);
}
}
int DeleteElemt(BinTree* T,int data)//要对元素操作,必须传递指针
{
if(!(*T))
return -1;//没找到该元素
if((*T)->data == data)//找到了,删除并返回
{
Delete(T);
return 0;
}
else if((*T)->data < data)
DeleteElemt(&(*T)->rchild,data);
else
DeleteElemt(&(*T)->lchild,data);
}
int main()
{
BinTree T = NULL;
BinTree p = NULL;
int arr[]={1,9,2,8,3,7,2,4,6,5,0,14,10,12,11};
int len = sizeof(arr)/sizeof(int);
for(int i = len-1;i>=0;i--)
{
Insert(&T,arr[i]);
}
p = Find(T,-1);
for(int i = 0;i<len;i++)
DeleteElemt(&T,arr[i]);
return 0;
}
二叉查找树基本操作
最新推荐文章于 2021-05-27 07:51:33 发布