二叉查找树

来源:互联网 发布:js变量命名的规则 编辑:程序博客网 时间:2024/06/07 05:35

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


0 0
原创粉丝点击