C++数据结构-二叉排序树的查找、创建和删除

#include <iostream>
#define TRUE 1
#define FALSE 0
using namespace std;

typedef int Status;

typedef struct BtNode
{
    int data; //数据域
    struct BtNode *lchild,*rchild;
}BtNode,*BTree;

//二叉排序树的查找操作
//参数1:BTree T ,查找操作不修改这个二叉排序树,所以不采用引用方式
//参数2:int key ,要查找的值
//参数3:BTree f ,f指向T的双亲,初始的值为NULL;
//参数4:BTree &p , 若找到,则p用来保存查找到的元素的位置,没找到则p=f,所以采用引用方式带回
/*********************************************************/
Status SerachBST(BTree T , int key ,BTree f, BTree &p)
{
    if(!T)   //查找不成功
    {
        p=f;
        return FALSE;
    }
    else if(key == T->data)  //查找成功
    {
        p=T;                 //p记录下查找到的位置
        return TRUE;
    }
    else if(key < T->data)
        return SerachBST(T->lchild,key,T,p); //在左子树继续查找
    else
        return SerachBST(T->rchild,key,T,p); //在右子树继续查找
}

//二叉排序树插入操作
//当二叉树不存在关键字等于key的数据元素时,插入key并返回TRUE,否则返回FALSE.
//参数1:BiTree &T ,因为插入操作要把最后结果带回来,所以在用引用
//参数2:int key , 要查找到的值,若没有该值,则插入,若有则不再插入
/*********************************************************/
Status InsertBST(BTree &T , int key)
{
    BTree p,s;
    if(!SerachBST(T ,key ,NULL ,p)) //查找不成功
    {
        s= new BtNode;
        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;      //树中已经有关键字相同的结点,不再插入
}

//从二叉排序树中删除结点p,并重接他的左或右子树
/*********************************************************/
Status Delete(BTree &p)
{
    BTree q,s; //借助这两个指针
    if(p->rchild == NULL)  //被删结点的右子树为空,则只需要重接他的左子树
    {
        q=p;
        p=p->lchild;
        delete q;
    }
    else if(p->lchild == NULL) //被删结点的左子树为空,则只需要重接他的右子树
    {
        q=p;
        p=p->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->rchild = s->lchild; //重接q的右子树
        else
            q->lchild = s->lchild; //重接q的左子树
        delete s;
    }
    return TRUE;
}

//二叉书排序树的删除操作(先找到后删除)
//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点
//并返回TRUE,否则返回FALSE
/*********************************************************/
Status DeleteBST(BTree &T , int key)
{
    if(!T) //表明不存在关键字等于key的数据元素
        return FALSE;
    else
    {
        if(key == T->data) //找到关键字等于key的数据元素
            return Delete(T);
        else if(key < T->data)
            return DeleteBST(T->lchild ,key);
        else
            return DeleteBST(T->rchild ,key);
    }
}

int main()
{
    BTree T = NULL;
    BTree p ,q;
    BTree f = NULL;
    int a[10]={62,88,58,47,35,73,51,99,37,93};
    for(int i=0;i<10;i++)
        InsertBST(T,a[i]);
    SerachBST(T,93,f,p);
    cout<<"找到了:"<<p->data<<endl;
    DeleteBST(T,93);   //删除93这个结点
    int result = SerachBST(T,93,f,q);
    if(result == TRUE) //表示找到93
        cout<<q->data<<endl;
    else               //表示没找到
        cout<<"没找到!!!";
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43323201/article/details/84894714