文章目录

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

二分查找与二叉排序树

二分查找

1. 二分查找

将 target 插入有序数组中,要求插入后数组仍然有序,返回插入位置的下标

int search(vector<int> &nums, int target) {int index = -1;int begin = 0;int end = nums.size()-1;while(index == -1) {int mid = begin + end >> 1;if(target == nums[mid]) index = mid;else if(target > nums[mid]) {if(mid + 1 == nums.size() || target < nums[mid+1]) index = mid + 1;begin = mid + 1;}else {if(mid == 0 || target > nums[mid-1]) index = mid;end = mid - 1;}}return index;
}

2. 区间查找

找到一串数中某个数在区间中的跨度
分别找到左右端点坐标

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

3. 基于旋转数组的二分查找

题目链接

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]) { // 情况 1 if(nums[begin] == nums[mid]) begin = mid + 1; // 特判如果只有两个元素的情况,小标为 0 1else if(nums[begin] > nums[mid]) end = mid - 1;else {if(target >= nums[begin]) end = mid  - 1;else begin = mid + 1;}}else if(target > nums[mid]) { // 情况 2 if(nums[begin] == nums[mid]) begin = mid + 1; // 特判else if(nums[begin] < nums[mid]) begin = mid + 1;else {if(target < nums[begin]) begin = mid + 1;else end = mid - 1;}}}return -1;
}

二叉查找(排序)树

查找数据结构,树上查找
二叉排序树性质: 每个节点的左子树节点的值一定小于等于该节点,右子树的节点大于等于该节点
中序遍历:从小到达

1. 插入节点

从根节点出发,通过比较 insert_node 与 node 的大小,寻找插入位置

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;}
}

2. 查找节点

bool BST_search(TreeNode *node, int value) {if(node->val == value) return 1; // 找到 else if(node->val > value) { // 去左子树找 if(node->left) return BST_search(node->left, value);return 0; // 没找到 }else { // 去右子树找 if(node->right) return BST_search(node->right, value);return 0;}
}

二分查找与二叉排序树相关推荐

  1. 数据结构与算法——二分查找与二叉排序树

    文章目录 1.预备知识 1.1 题目目录 1.2 二分查找 1.3 递归二分查找 1.4 循环二分查找 1.5 二叉查找(排序)树 1.6 二叉搜索树的代码实现 2.搜索插入位置 2.1 题目描述 2 ...

  2. 数据结构(三)——有序表查找(二分查找到二叉树)

    这次更新数据结构查找的部分,先上一个查找的思维导图,有一个宏观认识 今天要分享的主题就是导图中用红框括起来的地方,二分查找的题用二叉树去解决,这个来源于最近做数据结构自考题,把这个题先写出来 题目: ...

  3. 数据结构树之二分查找树

    二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: ...

  4. 数据结构源码笔记(C语言):二分查找

    //实现二分查找的算法#include<stdio.h> #include<malloc.h> #include<malloc.h>#define MAXL 100 ...

  5. Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找

    Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...

  6. 二分查找和二叉查找树

    2019独角兽企业重金招聘Python工程师标准>>> 1  二分查找 算法思想: 二分查找要求元素排列有序.首先,假设表中元素是按升序排列,将数组中间位置的元素与查找关键字比较,如 ...

  7. vue 怎么样不重复往数组里插入数据_前端数据结构与算法(1) -二分查找vs二叉树...

    今天给大家开始介绍前端方面的数据结构,刚把vue源码过完就开始数据结构,可见它的地位有多重要.有人说我一前端又不是后端学这个数据结构干嘛,好吧,只能说你还没有这个意识,一是面试很多大厂就会考察,我面试 ...

  8. java二分查找法视频_078-二分查找算法思路图解

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  9. d - 数据结构实验之查找四:二分查找_【数据结构】资料

    春天来了,关注我们吧!! 数据结构资料 1.栈和队列的共同特点是( ). A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 答案:A 解析:栈的操作只允许在栈的一端 ...

最新文章

  1. QCon上海2015热点前瞻:Uber伸缩之道、注重实效的性能
  2. 客制化键盘编程_客制化键盘如何入坑?
  3. Windows内存保护机制及绕过方法
  4. [转载] Docker网络原则入门:EXPOSE,-p,-P,-link
  5. 华为3500光端机基本介绍_华为OSN3500光端机License授权管理介绍
  6. 当下学习Linux该选择哪个产品?
  7. 腾讯云重装和还原操作系统
  8. js如何获取计算机当前时间,js获取当前系统时间实例代码
  9. HAU寒假训练第一周
  10. Java java.sql.SQLSyntaxErrorException:Duplicate column name ‘xxx‘问题解决
  11. PA1--实现基础设施、表达式求值和监视点
  12. Python+Appium+unittest demo
  13. 护照阅读器助力港珠澳大桥拓展大湾区
  14. ajaxSubmit的使用总结
  15. 程序员眼中的优秀记帐软件
  16. 如何零基础自学平面广告设计
  17. 分享保护视力应用桌面
  18. 华大HC芯片实现定时器计数
  19. 我,一个走在创业路上人的自白——贝勒爷
  20. 使用Prerender.io进行网站预加载

热门文章

  1. 对象检测和图像分割有什么区别?
  2. 链表问题14——在单链表种删除指定值的节点
  3. 浅析Kubernetes StatefulSet
  4. Linux运维之道之ENGINEER1.1(配置邮件服务器,数据库管理基础,表数据管理)
  5. 英特尔、高通争战物联网芯片 下个霸主会是谁
  6. Python 正则表达式
  7. Activiti 笔记
  8. MyBatis一对多双向关联——MyBatis学习笔记之七
  9. BZOJ3262 : 陌上花开
  10. [Cocos2d-x]视差滚屏效果的实现