二叉查找树,空树或满足下列条件:
- 若它的左子树不空,左子树上所有结点的值均小于它的根结构的值
- 若它的右子树不空,右子树上所有结点的值均大于它的根结点的值
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
- 二叉排序树查找操作
- 二叉排列树插入操作
- 二叉排序树删除操作
二叉排序树查找操作
bool SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{
if(!T)//查找不成功
{
*p=f;
return false;
}
else if(key==T->data)
{
*p=T;
return true;
}
else if(key<T->data)
return SearchBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,T,p);
}
二叉排序树插入操作
bool InsertBST(BiTree *T,int key)
{
BiTree p,s;
if(!SearchBST(*T,key,NULL,&p))//没有查到该key就要插入,查到了的话p指向要插入的位置上一个位置
{
s=(BiTree)malloc(sizeof(BiTNode));//建立要插入的结点
s->data=key;
s->lchild=s->rchild=NULL;
if(!p)//该树还没有一个结点,建树
*T=s;
else if(key<p->data)
p->lchild=s;
else p->rchild=s;
return true;
}
else return false;
}
二叉排序树删除操作
bool Delete(BiTree *p)//删除结点
{
BiTree q,s;
if((*p)->rchild==NULL)//若无右子树或无子树,重接左子树
{
q=*p;
*p=(*p)->lchild;
delete q;
}
else if((*p)->lchild==NULL)
{
q=*p;
*p=(*p)->rchild;
delete q;
}
else//若都左右有,找到替代该结点值的值(左子树的最右结点),然后删除代替点
{
q=*p;
s=(*p)->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
(*p)->data=s->data;
if(q!=(*p))
q->rchild=s->lchild;
else q->lchild=s->lchild;
delete s;
}
return true;
}
bool DeleteBST(BiTree *T,int key)///找到要被删除的结点
{
if(!*T)
return false;
else
{
if(key==(*T)->data)
return Delete(T);//删除结点
else if(key<(*T)->data)
return DeleteBST(&((*T)->lchild),key);
else return DeleteBST(&(*T)->rchild,key);
}
}
if((*p)->rchild==NULL)//若无右子树或无子树,重接左子树
{
q=*p;
*p=(*p)->lchild;
delete q;
}
改变的是二级指针的值(也就是一级指针)
我认为二级指针的值改变了,调用原一级指针时指针指向位置改变(不然无法解释重接左子树)
如果有大佬知道如何更准确的解释,欢迎评论,指点。