1. 查找
Status SearchBST(BiTree T, KeyType key, BiTree f, BiTree &p){
if(!T) { //查找不成功
p=f;
return false;
}
else if (key == T->data.key) { //查找成功
p=T;
return true;
}
else if (key < T->data.key)
return SearchBST(T->lchild, key, T, p);
else
return SearchBST(T->rchild, key, T, p);
}
2. 插入
Status InsertBST(BiTree *T, ElemType e){
if(!T)
{
s = new BiTNode;
s->data = e; s->lchild = s->rchild = NULL;
T=s; //被插節点*s为新的根结点
}
else if(e.key == T->data.key)
return false;//关键字等于e.key的数据元素,返回錯誤
if (e.key < T->data.key)
InsertBST(T->lchild, e); //將e插入左子樹
else
InsertBST(T->rchild, e); //將e插入右子樹
return true;
}
3. 删除
Status DeleteBST(BiTree *T, KeyType key){
//若二叉查找树T中存在关键字等于key的数据元素时,则删除该数据元素,并返回
//TRUE;否则返回FALSE
if(!T)
return false; //不存在关键字等于key的数据元素
else{
if(key == T->data.key) { // 找到关键字等于key的数据元素
return Delete(T);
}
else if(key < T->data.key)
return DeleteBST(T->lchild, key);
else
return DeleteBST(T->rchild, key);
}
}
Status Delete(BiTree *p){
//该节点为叶子节点,直接删除
BiTree *q, *s;
if (!p->rchild && !p->lchild)
{
delete p;
p = NULL;
}
else if(!p->rchild){ //右子树空则只需重接它的左子树
q=p->lchild;
p->data = p->lchild->data;
p->lchild=p->lchild->lchild;
p->rchild=p->lchild->rchild;
delete q;
}
else if(!p->lchild){ //左子树空只需重接它的右子树
q=p->rchild;
p->data = p->rchild->data;
p->lchild=p->rchild->lchild;
p->rchild=p->rchild->rchild;
delete q; }
else{ //左右子树均不空
q=p;
s=p->lchild;
while(s->rchild){
q=s;
s=s->rchild;
} //转左,然后向右到尽头
p->data = s->data; //s指向被删结点的“前驱”
if(q!=p) //q为s的parent, 但q有可能为p
q->rchild = s->lchild; //重接*q的右子树
else
q->lchild = s->lchild; //重接*q的左子树
delete s;
}
return true;
}