您的位置:首页 > 其它

二叉排序树的查询、插入和删除操作

2016-03-16 21:54 387 查看
//二叉排序树查找
//创建二叉树的结点结构定义
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;

//递归查找二叉排序树T中是否存在key
//指针f指向T的双亲,其初始调用值为NULL
//若查找成功,则指针p指向该数据元素结点,并返回TRUE
//若查找不成功,p指向查找路径访问的最后一个结点,并返回FALSE
Status Search_BST(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 Rearch_BST(T->lchild,key,T,p);
else if(key>T->data)
return Rearch_BST(T->rchild,key,T,p);
}

//二叉排序树插入操作,如果找不到key,就将key插入到合适的位置
Status InsertBST(BiTree T, int key)
{
BiTree p,s;
if(!Search_BST(T,key,NULL,&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 if(key>p->data)
{
p->rchild = s;
}
return true;
}
else
{
return false;
}
}

//二叉排序树删除操作
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;
if(q!=p && !(s->lchild))
{
q->rchild = s->lchild;
}
else
{
q->lchild = s->lchild;
}
free(s);
}
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: