二叉搜索树的查找、插入、删除的递归与非递归实现(C语言)

【概念】
什么是二叉搜索树?
二叉搜索树又称二叉排序树(按照中序遍历,可以得到一组有序的序列),它或者是一颗空树,或者是具有以下性质的二叉树:
若他的左子树不为空,则左子树上所有节点的值都小于根结点的值。
若他的右子树不为空,则右子树上所有节点的值都大于根结点的值。
他的左右子树也分别为二叉搜索树。

【二叉搜索树的简单操作】

查找

根据二叉搜索树的性质可知,在一棵树中,根节点比其左子树任何一个值都大,比右子树任何一个值都小,所以可将查找分为三步(前提:根节点不为空):

  • 用待查找的值=根节点的值,则直接返回true;
  • 如果待查找的值>根节点的值,则在其右子树中查找;
  • 如果待查找的值<根节点的值,在其左子树中查找。

话不多说,直接上代码(首先是非递归)

int BSTreeNodeFindNor(BSTreeNode pRoot,DataType data)//查找(非递归)
{
    if (NULL == pRoot)
    {
        printf("树为空\n");
    }
    while (pRoot)
    {
        if (pRoot->_data == data)
        {
            return 1;
        }
        else if (pRoot->_data > data)
        {
            pRoot = pRoot->_pLeft;
        }
        else if (pRoot->_data < data)
        {
            pRoot = pRoot->_pRight;
        }
        else
        {
            return 0;
        }
    }
    return 0;
}

递归

int BSTreeNodeFind(BSTreeNode pRoot, DataType data)//查找(递归)
{
    if (NULL == pRoot)
    {
        return 0;
    }
    else
    {
        if (data == pRoot->_data)
            return 1;
        else if (data < pRoot->_data)
            return BSTreeNodeFind(pRoot->_pLeft, data);
        else if (data > pRoot->_data)
            return BSTreeNodeFind(pRoot->_pRight, data);
    }
    return 0;
}

插入

在二叉搜索树中插入新元素时,必须确保该元素不在二叉树中,如果在则不进行插入,否则将新元素插入到搜索停止的地方。具体步骤分为两步:

  • 树为空,则直接插入,然后返回;
  • 树不为空,按二叉搜索树的性质查找插入的位置,若带插入的元素小于她的双亲,则插入到双亲左侧,否则插入到双亲右侧。

具体代码框架如图所示:
这里写图片描述

非递归代码如下:

void BSTreeNodeInsertNor(BSTreeNode* pRoot, DataType data)//插入(非递归)
{
    //树为空,直接插入
    if (NULL == *pRoot)
    {
        *pRoot = BuyBSTreeNode(data);
        return;
    }
    //树不为空
    //找插入位置
    else
    {
        BSTreeNode pCur = NULL;
        BSTreeNode pParent = NULL;
        assert(pRoot);
        pCur = *pRoot;
        while (pCur)
        {
            if (data == pCur->_data)
            {
                return;
            }
            else if (data < pCur->_data)
            {
                pParent = pCur;
                pCur = pCur->_pLeft;
            }
            else if (data > pCur->_data)
            {
                pParent = pCur;
                pCur = pCur->_pRight;
            }
            else
            {
                return;
            }
        }
        if (pParent->_data<data)
            pParent->_pRight = BuyBSTreeNode(data);
        else if (pParent->_data>data)
            pParent->_pLeft = BuyBSTreeNode(data);
    }
}

递归代码如下:

int BSTreeNodeInsert(BSTreeNode* pRoot, DataType data)//插入(递归)
{
    
  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值