二分查找与二叉排序树
文章目录
- 二分查找与二叉排序树
- 二分查找
- 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.2 二分查找 1.3 递归二分查找 1.4 循环二分查找 1.5 二叉查找(排序)树 1.6 二叉搜索树的代码实现 2.搜索插入位置 2.1 题目描述 2 ...
- 数据结构(三)——有序表查找(二分查找到二叉树)
这次更新数据结构查找的部分,先上一个查找的思维导图,有一个宏观认识 今天要分享的主题就是导图中用红框括起来的地方,二分查找的题用二叉树去解决,这个来源于最近做数据结构自考题,把这个题先写出来 题目: ...
- 数据结构树之二分查找树
二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: ...
- 数据结构源码笔记(C语言):二分查找
//实现二分查找的算法#include<stdio.h> #include<malloc.h> #include<malloc.h>#define MAXL 100 ...
- Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找
Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...
- 二分查找和二叉查找树
2019独角兽企业重金招聘Python工程师标准>>> 1 二分查找 算法思想: 二分查找要求元素排列有序.首先,假设表中元素是按升序排列,将数组中间位置的元素与查找关键字比较,如 ...
- vue 怎么样不重复往数组里插入数据_前端数据结构与算法(1) -二分查找vs二叉树...
今天给大家开始介绍前端方面的数据结构,刚把vue源码过完就开始数据结构,可见它的地位有多重要.有人说我一前端又不是后端学这个数据结构干嘛,好吧,只能说你还没有这个意识,一是面试很多大厂就会考察,我面试 ...
- java二分查找法视频_078-二分查找算法思路图解
2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...
- d - 数据结构实验之查找四:二分查找_【数据结构】资料
春天来了,关注我们吧!! 数据结构资料 1.栈和队列的共同特点是( ). A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 答案:A 解析:栈的操作只允许在栈的一端 ...
最新文章
- QCon上海2015热点前瞻:Uber伸缩之道、注重实效的性能
- 客制化键盘编程_客制化键盘如何入坑?
- Windows内存保护机制及绕过方法
- [转载] Docker网络原则入门:EXPOSE,-p,-P,-link
- 华为3500光端机基本介绍_华为OSN3500光端机License授权管理介绍
- 当下学习Linux该选择哪个产品?
- 腾讯云重装和还原操作系统
- js如何获取计算机当前时间,js获取当前系统时间实例代码
- HAU寒假训练第一周
- Java java.sql.SQLSyntaxErrorException:Duplicate column name ‘xxx‘问题解决
- PA1--实现基础设施、表达式求值和监视点
- Python+Appium+unittest demo
- 护照阅读器助力港珠澳大桥拓展大湾区
- ajaxSubmit的使用总结
- 程序员眼中的优秀记帐软件
- 如何零基础自学平面广告设计
- 分享保护视力应用桌面
- 华大HC芯片实现定时器计数
- 我,一个走在创业路上人的自白——贝勒爷
- 使用Prerender.io进行网站预加载