二叉搜索树(Binary Search Tree)

二叉搜索树(Binary Search Tree),也称为“二叉查找树”,是指一颗空树或者具有下列性质的二叉树:
    1. 任意节点的左子树不空,则左子树上所有节点的值“小于等于”它的跟节点的值。
    2. 任意节点的右子树不空,则右子树上所有节点的值“大于等于”它的跟节点的值。
    3. 任意节点的左子树、右子树也都为二叉查找树。

二叉查找树的特点:左子树<=根节点<=右子树!!!!


二叉查找树的优势:其查找、插入的时间复杂度较低,为O(log2n), 最坏为O(n)。
二叉查找树的应用场景:二叉查找树时基础的线性数据结构,用于“构建更为抽象的数据结构,如集合、multiset、关联数组等”。

二叉搜索树实现:
    1. 先构建一颗二叉搜索树,使树符合二叉搜索树的性质(使用链表实现)。本次讲解的数列是“没有相同元素的数列”!!!
    2. 给定一个搜索值value,如果值等于根节点,则查找到!!
    3. 如果value 小于根节点,则比较根节点的左子树。
    4. 如果value 大于根节点,则比较根节点的右子树。

5. 循环2、3、4,直到搜索完或找到。

实现代码:
struct Tree
{
int value;
Tree* pLeft;
Tree* pRight;
};

/*
Desc: 二叉查找树增加元素
Param: pRootTree 跟节点
Param:value 需要增加的元素的值
*/
void AddElementToBST(Tree* pRootTree, int value)
{
if (pRootTree == NULL)
{
return;
}

if (pRootTree->value > value)
{
    if (pRootTree->pLeft == NULL)
    {
        Tree* pNewTree = new Tree();
        pNewTree->value = value;
        pNewTree->pLeft = NULL;
        pNewTree->pRight = NULL;

        pRootTree->pLeft = pNewTree;
    }
    else
    {
        AddElementToBST(pRootTree->pLeft, value);
    }

}
else
{
    if(pRootTree->pRight == NULL)
    { 
        Tree* pNewTree = new Tree();
        pNewTree->value = value;
        pNewTree->pLeft = NULL;
        pNewTree->pRight = NULL;

        pRootTree->pRight = pNewTree;
    }
    else
    {
        AddElementToBST(pRootTree->pRight, value);
    }

}

}

/*
Desc: 创建二叉查找树
Param: vTree 树节点的集合
Param: array 查询数组
Param: size 数组长度
reutrn: 二叉查找树的跟节点
*/
Tree* CreateBinarySearchTree(int array[], int size)
{
if ((size <= 0) || (array == NULL))
{
return NULL;
}

Tree* pRootTree = NULL;
for (int i=0; i<size; i++)
{
    if (pRootTree == NULL)
    {
        pRootTree = new Tree();
        pRootTree->value = array[i];
        pRootTree->pLeft = NULL;
        pRootTree->pRight = NULL;
    }
    else
        AddElementToBST(pRootTree, array[i]);
}

return pRootTree;

}

/*
Desc: 二叉查找树查询
Param: array 查询数组
Param: size 数组长度
Param:searchValue 查询的值
return:如果没找到,返回-1
*/
int BST(int array[], int size, int searchValue)
{
Tree* pBST = CreateBinarySearchTree(array, size);
while (pBST)
{
if (pBST->value == searchValue)
{
cout << “已经找到!!!” << endl;
//没有释放内存!!!!
return 1;
}
else if (pBST->value < searchValue)
{
pBST = pBST->pRight;
}
else
{
pBST = pBST->pLeft;
}
}

//没有释放内存!!!!
return -1;

}

结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值