排序二叉树的建立、插入、删除、查找

/*
名称:排序二叉树的建立、插入、删除、查找
说明:对于排序二叉树来说,其创建、插入和查找的算法差不多。简单来说,就是小了往左,大了往右。
对于二叉排序树的删除来说,稍微要复杂一点,要分成基本的几种情况:即
(1)、删除的结点是叶子节点
(2)、删除结点只有左子树或者只有右子树
(3)、删除的结点既有左子树、又有右子树

此外还要注意删除的结点是否是根节点,程序中需要稍微注意一下。

*/

//二叉排序树的插入
int BST_Insert(BiTree &T,int key)
{
    if(T == NULL)
    {
        T = new BiTNode;
        T->data = key;
        T->lchild = T->rchild = NULL;

        return 0;       //插入成功

    }
    else if(T->data == key)
        return -1;          //树中已经含有元素,插入失败
    else if(T->data < key)
        return BST_Insert(T->rchild,key);
    else
        return BST_Insert(T->lchild,key);
}


//创建二叉排序树
void Creat_BSTree(BiTree &T)
{
    int val = 0;

    cin>>val;
    while(-1 != val)
    {
        if(BST_Insert(T,val) == -1)
            cout<<"element has existed already , insert failed!"<<endl;

        cin>>val;
    }

}

//二叉排序树的查找
BiTNode * BST_Search(BiTree T,int key)
{
    BiTNode *p = T;

    while(p != NULL)
    {
        if(p->data < key)
            p = p->rchild;      //转向右子树
        else if(p->data > key)
            p = p->lchild;      //转向左子树
        else
        {
            return p;
        }

    }

    return NULL;    //返回值为空代表未查找到指定元素

}



//二叉排序树的删除
bool DelInBSTree(BiTree &T,int key)
{
    BiTNode *p = T,*pre = NULL;

    //判断待删除的节点是不是根节点,如果是根节点的话,需要特殊处理下
    if(T != NULL && T->data == key )
    {
        if(T->rchild != NULL)
            T = T->rchild;
        else if(T->lchild != NULL)
            T = T->lchild;
        else
            T = NULL;

        return true;
    }
    else    //删除的不是根结点
    {
        while(p != NULL)
        {
            if(p->data < key)
            {
                 pre = p;
                  p = p->rchild;      //转向右子树
            }

            else if(p->data > key)
            {
                 pre = p;
                 p = p->lchild;      //转向左子树
            }
            else
                break;

        }

        if(p == NULL)
            return false;
        else
        {
                //若p的左子树和右子树都不为空时
            if(p->lchild != NULL && p->rchild != NULL)                //p的左子树和右子树都不为空
            {

                pre  = p;

                BiTNode *temp = pre->rchild;      //temp指向待删除结点的后继结点,即上移元素后要删除的结点

                //找到待删除元素的直接后继结点,用其代替当前节点
                while(temp->lchild != NULL)
                {
                    pre = temp;
                     temp = temp->lchild;
                }


                p->data = temp->data;   //上移元素
                p = temp;

            }


            //如果被删除元素是叶子节点
            if(p->lchild == NULL && p->rchild == NULL)
            {
                //将待删除结点的父节点对应指针域赋空
                    if(pre->lchild == p)
                         pre->lchild = NULL;
                    else if(pre->rchild == p)
                        pre->rchild = NULL;

                    delete p;      //删除指定结点
            }
            else if(p->lchild == NULL)      //被删除结点的左子树为空,右子树不空
            {
                if(pre->lchild == p)
                    pre->lchild = p->rchild;
                else if(pre->rchild == p)
                    pre->rchild = p->rchild;

                delete p;
            }
            else if(p->rchild == NULL)      //被删除结点的右子树为空,左子树不空
            {
                if(pre->lchild == p)
                    pre->lchild = p->lchild;
                else if(pre->rchild == p)
                    pre->rchild = p->lchild;

                delete p;
            }
        }

        return true;
    }

}

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/plm199513100/article/details/78702341
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞