二分查找和二分查找树

预备知识1:二分查找算法(折半查找法)
首先假设表中的元素时升序排列的,将表中间的位置和查找关键字比较:
1、如果相等,则查找成功
2、否则利用中间位置前后的两个子表:
1)如果中间位置大于目标更好换剪子,则用同样的方式再前一子表进行查找
2)否则在后一子表进行查找
重复上述过程,满足条件则成功;否则没有子表则失败。
预备知识2:二分查找(排序)树
二叉查找树具有的性质:
1、若左子树不空,则左子树上的所有节点均小于等于根节点
2、若右子树不空,则右子树上的所有节点均大于等于根节点
3、左右子树也分别为二叉排序树
4、等于的情况仅出现在左侧或右侧的某一侧
二叉树查找树插入节点:
如果insert_node节点值小于当前node节点值:
如果node有左子树,则递归将该节点插入至左子树为根的二叉排序树中
否则,将node_left赋值为该节点地址
否则,如果insert_node节点值大于等于当前node节点值
如果node有右子树,则递归将该节点插入至右子树为根的二叉排序树中
否则,将node_right赋值为该节点地址
二叉树查找树查找节点:
如果insert_node节点值小于当前node节点值:
如果node有左子树,则递归在左子树为根的二叉排序树中查找
否则,返回false
否则,如果insert_node节点值大于等于当前node节点值
如果node有右子树,则递归在右子树为根的二叉排序树中查找
否则,返回false

一、插入位置 LeetCode35

题目:

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2

示例 2:
输入: [1,3,5,6], 2
输出: 1

示例 3:
输入: [1,3,5,6], 7
输出: 4

示例 4:
输入: [1,3,5,6], 0
输出: 0
思路:
在二分查找的基础上加上一些判断条件:
首先依旧是将中间位置的元素和target比较,如果相同则返回中间位置;
如果target比中间位置小且比中间位置的前一个位置大,或者target比所有元素都小(mid == 0)的情况,则返回mid;否则让end = mid-1继续搜索;
如果target比中间位置大且比中间位置的后一个位置小,或者target比所有元素都大(mid ==nums.size()-1)的情况,则返回mid+1;否则让begin = mid+1继续搜索,知道找到可以插入的位置。
**注:**边界条件要写前面!!! 否则会发生溢出

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int begin = 0;//用来存储搜索区域初始位置
        int end = nums.size()-1;//用来存储搜索区域结束位置
        int index = -1;//用来存储返回位置(不设置变量直接return会有错)
        while(index == -1){
            int mid = (begin + end)/2;//存储查找区域的中间位置
            if(target == nums[mid]) index = mid;//找到了则返回相应位置
            else if(target < nums[mid]){
        //如果目标小于中间的值则在前半部分搜索,并判断是否有相应位置
                if(mid == 0 || target > nums[mid-1] )//要考虑添加目标比所有数字都小的情况 
					//边界条件
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值