文章目录

  • 1.预备知识
    • 1.1 题目目录
    • 1.2 二分查找
    • 1.3 递归二分查找
    • 1.4 循环二分查找
    • 1.5 二叉查找(排序)树
    • 1.6 二叉搜索树的代码实现
  • 2.搜索插入位置
    • 2.1 题目描述
    • 2.2 C++代码实现
  • 3.区间查找
    • 3.1 题目描述
    • 3.2 算法思路
    • 3.3 C++代码实现
  • 4.旋转数组查找
    • 4.1 题目描述
    • 4.2 解题思路
    • 4.3 C++代码实现
  • 5.序列化和反序列化二叉搜索树
    • 5.1 题目描述
    • 5.2 算法思路
    • 5.3 C++代码实现
  • 6.计算右侧小于当前元素的个数
    • 6.1 题目描述
    • 6.2 算法思路
    • 6.3 C++代码实现

1.预备知识

1.1 题目目录

1.2 二分查找


1.3 递归二分查找

bool binary_search(vector<int>& sort_array, int begin, int end, int target) {if (begin>end) {return false;}int mid = (begin + end) / 2;if (target == sort_array[mid]) {return true;}else if (target < sort_array[mid]) {binary_search(sort_array, begin, mid - 1, target);}else if (target > sort_array[mid]) {binary_search(sort_array, mid + 1, end, target);}
}

1.4 循环二分查找

bool binary_search(vector<int>& sort_array, int target) {int begin = 0;int end = sort_array.size() - 1;while (begin<=end) {int mid = (begin + end) / 2;if (target == sort_array[mid]) {return true;}else if(target < sort_array[mid]) {end = mid - 1;}else if (target > sort_array[mid]) {begin = mid + 1;}}return false;
}

1.5 二叉查找(排序)树


1.6 二叉搜索树的代码实现

1.二叉搜索树的插入

void solution::BST_insert(TreeNode* node, TreeNode* insert_node) {if (insert_node->val < node->val) {if (node->left) {BST_insert(node->left, insert_node);}else {node->left = insert_node;}}else {if (node->right) {BST_insert(node->right, insert_node);}else {node->right = insert_node;}}
}

2.二叉搜索树的搜索

bool solution::BST_search(TreeNode* node, int value) {if (value == node->val) {return true;}else if (value < node->val) {if (node->left) {BST_search(node->left, value);}else {return false;}}else if (value > node->val) {if (node->right) {BST_search(node->right, value);}else {return false;}}
}

2.搜索插入位置

2.1 题目描述

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

2.2 C++代码实现

class Solution {public:int searchInsert(vector<int>& nums, int target) {int begin=0;int end=nums.size()-1;int index=-1;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]){index=mid;}end=mid-1;}else if(target>nums[mid]){if(mid==nums.size()-1||target<nums[mid+1]){index= mid+1;}begin=mid+1;}}return index;}
};

3.区间查找

3.1 题目描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

3.2 算法思路

3.3 C++代码实现

class Solution {public:int left_bound(vector<int>& nums,int target){int begin=0;int end=nums.size()-1;while(begin<=end){int mid=(begin+end)/2;if(target==nums[mid]){if(mid==0||target>nums[mid-1]){return mid;}end=mid-1;}else if(target<nums[mid]){end=mid-1;}else if(target>nums[mid]){begin=mid+1;}}return -1;}int right_bound(vector<int>& nums,int target){int begin=0;int end=nums.size()-1;while(begin<=end){int mid=(begin+end)/2;if(target==nums[mid]){if(mid==nums.size()-1||target<nums[mid+1]){return mid;}begin=mid+1;}else if(target<nums[mid]){end=mid-1;}else if(target>nums[mid]){begin=mid+1;}}return -1;}vector<int> searchRange(vector<int>& nums, int target) {int left=left_bound(nums,target);int right=right_bound(nums,target);vector<int> result;result.push_back(left);result.push_back(right);return result;}
};

4.旋转数组查找

4.1 题目描述

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

4.2 解题思路


4.3 C++代码实现

class Solution {public:int search(vector<int>& nums, int target) {int begin=0;int end=nums.size()-1;while(begin<=end){int mid=(begin+end)/2;if(target==nums[mid]){return mid;}else if(target<nums[mid]){if(nums[begin]<nums[mid]){if(target>=nums[begin]){end=mid-1;}else{begin=mid+1;}}else if(nums[begin]>nums[mid]){end=mid-1;}else if(nums[begin]==nums[mid]){begin=mid+1;}}else if(target>nums[mid]){if(nums[begin]<nums[mid]){begin=mid+1;}else if(nums[begin]>nums[mid]){if(target>=nums[begin]){end=mid-1;}else{begin=mid+1;}}else if(nums[begin]==nums[mid]){begin=mid+1;}}}return -1;}
};

5.序列化和反序列化二叉搜索树

5.1 题目描述

序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。

设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。

编码的字符串应尽可能紧凑。

5.2 算法思路


5.3 C++代码实现

class Codec {public:void BST_insert(TreeNode* node, TreeNode* insert_node) {if (insert_node->val < node->val) {if (node->left) {BST_insert(node->left, insert_node);}else {node->left = insert_node;}}else {if (node->right) {BST_insert(node->right, insert_node);}else {node->right = insert_node;}}}void change_int_to_string(int val, string& str_val) {string tmp;while (val) {tmp += val % 10 + '0';val = val / 10;}for (int i = tmp.length()- 1; i >= 0; i--) {str_val += tmp[i];}str_val += '#';}/*9.2 将二叉查找树按照前序遍历的方式,转化为字符串,数字之间使用#隔开*/void BST_preorder(TreeNode* node, string& data) {if (!node) {return;}string str_val;change_int_to_string(node->val, str_val);data += str_val;BST_preorder(node->left, data);BST_preorder(node->right, data);}// Encodes a tree to a single string.string serialize(TreeNode* root) {string data;BST_preorder(root,data);return data;   }// Decodes your encoded data to tree.TreeNode* deserialize(string data) {int val=0;vector<TreeNode*> node_vec;if(data.length()==0){return NULL;} for(int i=0;i<data.length();i++){if(data[i]=='#'){node_vec.push_back(new TreeNode(val));val=0;}else{val=val*10+(data[i]-'0');}}for(int i=1;i<node_vec.size();i++){BST_insert(node_vec[0],node_vec[i]);}return node_vec[0];}
};

6.计算右侧小于当前元素的个数

6.1 题目描述

给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。

示例:
输入:nums = [5,2,6,1]
输出:[2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1)
2 的右侧仅有 1 个更小的元素 (1)
6 的右侧有 1 个更小的元素 (1)
1 的右侧有 0 个更小的元素

6.2 算法思路


6.3 C++代码实现

struct BSTNode{int val;int count;BSTNode* left;BSTNode* right;BSTNode(int x):val(x),count(0),left(NULL),right(NULL){}
};class Solution {public:void BSTInsert(BSTNode* node,BSTNode* insert_node,int& count_small){if(insert_node->val<=node->val){node->count++;if(node->left){BSTInsert(node->left,insert_node,count_small);}else{node->left=insert_node;}}else{count_small+=node->count+1;if(node->right){BSTInsert(node->right,insert_node,count_small);}else{node->right=insert_node;}}}vector<int> countSmaller(vector<int>& nums) {vector<int> result;vector<int> count;vector<BSTNode*> node_vec;for(int i=nums.size()-1;i>=0;i--){node_vec.push_back(new BSTNode(nums[i]));}count.push_back(0);for(int i=1;i<node_vec.size();i++){int count_small=0;BSTInsert(node_vec[0],node_vec[i],count_small);count.push_back(count_small);}for(int i=node_vec.size()-1;i>=0;i--){delete node_vec[i];result.push_back(count[i]);}return result;}
};

数据结构与算法——二分查找与二叉排序树相关推荐

  1. 数据结构与算法 | 二分查找

    假如我们在图书馆中整理书记,书按照序号有序排序,序号不连续,当我们需要从书堆中找到特定序号的书时,如果一本一本查找的话,我们可能需要查找N次.但如果我们先找到中间的书,将书分成两堆,与待查书对比,待查 ...

  2. 数据结构与算法——二分查找

    目录 前言 一.二分查找是什么? 二.代码示例 三.算法时间复杂度 总结 前言 二分查找是一种高效的查找算法,二分查找又称为折半查找,其输入是一个有序(升序或降序)的元素列表.本文通过具体的例子来说明 ...

  3. 数据结构与算法——二分查找与二叉查找树汇总整理

    目录 预备知识:二分查找基础知识 例1:插入位置(easy) (二分查找) 例2:区间查找(medium)(二分查找) 例3:旋转数组查找(medium)(二分查找) 预备知识:二叉查找(排序)树基础 ...

  4. 二分查找与二叉排序树

    文章目录 二分查找与二叉排序树 二分查找 1. 二分查找 2. 区间查找 3. 基于旋转数组的二分查找 二叉查找(排序)树 1. 插入节点 2. 查找节点 二分查找与二叉排序树 二分查找 1. 二分查 ...

  5. java 二分查找_计算机入门必备算法——二分查找法

    1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...

  6. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  7. 数据结构与算法-查找算法(二分查找,插值查找,斐波那契(黄金分割法)查找)

    查找算法 以下三种算法的基本思想相同,都是利用递归来寻找 二分查找 思路分析 1.首先确定该数组的中间下标,min = (left + right) / 2 2.然后让需要查找的的数findVal和a ...

  8. Java数据结构与算法——线性查找 二分查找 插值查找

    1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...

  9. Java数据结构与算法 线性查找和二分查找

    查找 查找(searching)是在一组数据项中找到指定的目标元素(target element)或者判定组内不存在目标的过程.要查找的数据项组有事成为查找池(search pool). 在此讨论两种 ...

最新文章

  1. 基于熵权法优劣解距离法_维普资讯中文期刊服务平台-基于改进TOPSIS方法的航空装备预研项目技术风险评估...
  2. 使用WinINet和WinHTTP实现Http訪问
  3. Java实用教程笔记 输入、输出流
  4. Android投票列表设计,AndroidCustomView一个简单的投票排名对比图
  5. hadoop集群的白名单和黑名单示例说明
  6. 负载策略_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略
  7. Linux网络流量监控Iftop安装
  8. react native使用百度echarts显示图表
  9. Jsoup根据URL加载一个Document
  10. javascript 中使用JSON
  11. Android 关于解决MediaButton学习到的media控制流程
  12. java俄罗斯方块代码_俄罗斯方块java源代码提供
  13. 在win中搭建IOS自动化
  14. java retainall_Java Set retainAll()用法及代码示例
  15. 发送RST报文的几种可能的情况
  16. 【Qt学习】 一键生成函数注释
  17. 心流:写作、编程和修炼武功的共同法门
  18. Python登录微信公众平台
  19. mysql 报错1366
  20. androig中相机的使用

热门文章

  1. LeetCode 1067. 范围内的数字计数
  2. LeetCode 624. 数组列表中的最大距离
  3. [scikit-learn 机器学习] 3. K-近邻算法分类和回归
  4. LeetCode 962. 最大宽度坡(单调栈)
  5. LeetCode 556. 下一个更大元素 III
  6. LeetCode 1171. 从链表中删去总和值为零的连续节点(哈希表)
  7. LeetCode 78. 子集(回溯)
  8. python re 匹配多行_Python正则表达式,看这一篇就够了
  9. java 中batch_java相关:Mybatis中使用updateBatch进行批量更新
  10. 爬虫工具:虚拟机Selenium和PhantomJS,ChromeDriver 镜像安装教程