预备知识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] )//要考虑添加目标比所有数字都小的情况
//边界条件