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

二叉排序树的定义:

(1)、如果左子树不为空,则左子树上所有关键字的值均小于根关键字的值;

(2)、如果右子树不为空,则右子树上所有关键字的值均大于根关键字的值;

(3)、左右子树又各是一棵二叉排序树。


一、查找

思想:查找的关键字要么在左子树,要么在右子树,要么在根结点上。根据二叉排序树的定义可知,根结点把所有关键字分为两部分,即大于它的在右子树,小于的在左子树。由此,可以先将要查找的关键字与根结点相比较,如果相等,则查找成功;如果大于,则到右子树里查找,此时不必考虑左子树;如果小于,则到左子树里查找,此时不必考虑右子树,以此类推。


//二叉排序树的查找

BTNode *BSTSearch(BTNode *bt,int key)
{
    if(bt == NULL)
    {
        return NULL;
    }
    else
    {
        if(bt->data == key)
        {
            return bt;
        }

        else if(key > bt->data)
        {
            return BSTSearch(bt->rchild,key);
        }

        else
        {
            return BSTSearch(bt->lchild,key);
        }
    }
}


二、插入


需要考虑要插入的元素是否已经存在于这个二叉树中。如果已经存在,则插入失败。如果不存在,对于不存在二叉排序树的关键字的插入,其查找不成功的位置就是关键字的插入位置。可以参考查找算法。

注意对于判空的处理

//二叉排序树的插入

int BSTInsert(BTNode *&bt,int key)
{
    if(bt == NULL)
    {
        bt = (BTNode*)malloc(sizeof(BTNode));
        bt->data = key;
        bt->lchild = bt->rchild = NULL;
        return 1;
    }

    else
    {
        if(key == bt->data) //已经存在
        {
            return 0;
        }
        else if(key > bt->data)
        {
            BSTInsert(bt->rchild,key);
        }
        else
        {
            BSTInsert(bt->lchild,key);
        }
    }
}


三、构造二叉排序树

只需建立一棵空树,然后逐个元素插入到空树中即可。


void CreatBST(BTNode *&bt,int key[],int n)
{
    bt = NULL;
    for(int i = 0;i < n;i++)
    {
        BSTInsert(bt,key[i]);
    }
}

四、删除关键字( p结点为要删除结点)

分类讨论:

(1)、p结点为叶子结点,直接删除即可。

(2)、p结点只有左子树没有右子树,或者只有右子树没有左子树。此时,只需把p结点删除,然后把它的左子树或者右子树放到原来它的位置上即可。

(3)、p结点既有左子树,又有右子树。此时可以转化成(1)或者(2)的情况,做法:先沿p的左子树右指针一直往右走,直到来到其右子树的最右边的一个结点r,然后p的关键字用r替换。最后判断是(1)还是(2)。(PS: 用被删结点左子树最右下的结点的值代替被删结点的值,然后删去最右下的结点   用被删结点右子树最左下的结点的值代替被删结点的值,然后删去最左下的结点


         


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