(1)二叉搜索树定义
/**树节点定义**/
typedef struct BitNode
{
int data;
struct BitNode *lChild,*rChild;
}BiTNode,*BiTree;
/***二叉树的搜索**/
//递归查找二叉树T中的Key是否存在,用指针f指向T的双亲,若查找成功则指针p指向该数据元素节点
//若失败,则指针指向路径上访问的最后一个节点,并返回false,也就是插入数据的位置
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
{
return searchBST(Key
}
}
/* 插入节点 */
bool insertBST(BiTree *T,int Key)
{
BiTree p,s;
if(!searchBST(*T,NULL,&p))//找插入位置p
{
s = (BiTree) new 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 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);
}
}
//具体删除节点操作
//分两种情况考虑,一种情况,就是删除的节点 只有左子树或者右子树,或者啥都没有 这种操作是一样的
//另外一种情况是左右子树都有,当我们找到删除节点的时候,要从其右子树找到一个值最小的节点和当前节点的值交换,然后再删除这个节点 因为这样可以满足删除该节点的二叉树依然是二叉排序树
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)->lChild ;
delete q;
}
else
{
q=*p;
s = p->rChild;
while(s->lChild)
{
q= s;
s = s->lChild;
}
(*p)->data = s->data;//值的替换
if(q!=*p)
q->rChild = s->lChild;
else
q->lChild =s->lChild;
delete s;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。