您的位置:首页 > 理论基础 > 数据结构算法

数据结构_8:查找:二叉排序树

2016-01-21 14:32 501 查看

二叉排序树

数据结构

typedef struct BiTNode //结点结构
{
int data;  //结点数据
struct BiTNode *lchild,*rchild; // 左右孩子指针
}BiTNode,*BiTree;


二叉排序树

//f 指向双亲
//若查找成功,则指针p指向数据元素结点,
//否则指针p指向查找路径上访问的最后一个节点

Status 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(ky<T->data)
return SearchBST(T->lchild,key,T,p); //左子树继续寻找
else
return SearchBST(T->rchild,key,T,p); //右子树继续寻找
}


二叉排序树的插入操作

Status InsertBST(BiTree *T,int key)
{
BiTree p,s;
if(!SearchBST(*T,key,NULL,&p))   //查找不成功
{
s=(BiTree)malloc(sizeof(BiTNode));
s->data=key;
s->lchild=s->rchild=NULL;
if(!p)
*T=s; //插入s为新的根结点
else if(key<p->data)
p->lchild=s;   //插入s为左孩子
else
p->rchild=s;   //插入s为右孩子
return TRUE;
}
else
return FALSE;
}


二叉排序树的删除

//1.叶子结点
//2.仅有左子树或者右子树
//3.左右子树都有结点:删除

Status 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);
}
}


删除结点

Status Delete(BiTree *p)
{
BiTree  q,s;
if((*p)->rchild==NULL)   //只需要接左子树
{
q=*p;*p=(*p)->lchild;free(q);
}

else if((*p)->lchild==NULL)  //只需要接右子树
{
q=*p;*p=(*p)->rchild;free(q);
}

else  //左右子树都非空
{
q=*p;s=(*p)->lchild;
while(s->rchild)  //转左,然后向右到尽头(待删除的点的前驱)
{
q=s;s=s->rchild;
}

(*p)->data=s->data;  //s指向被删除点的前驱
if(q!=*p)
q->rchild=s->lchild;  //重接q的右子树
else
q->lchild=s->lchild;  //重接q的左子树
free(s);
}
return TRUE;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: