目录

  • 预备知识:二分查找基础知识
  • 例1:插入位置(easy) (二分查找)
  • 例2:区间查找(medium)(二分查找)
  • 例3:旋转数组查找(medium)(二分查找)
  • 预备知识:二叉查找(排序)树基础知识
  • 例4:逆序数(hard)(二叉查找树应用)

预备知识:二分查找基础知识

在列表A中查找B列表中元素是否存在,存在为1否则为0,结果存在result列表中。
递归实现:

#include <stdio.h>
#include <vector>bool binary_search(std::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]) {return binary_search(sort_array, begin, mid - 1, target);}else if (target > sort_array[mid]) {return binary_search(sort_array, mid + 1, end, target);}
}std::vector<int> search_array(std::vector<int>& sort_array,std::vector<int>& random_array) {std::vector<int> result;for (int i = 0; i < random_array.size(); i++) {int res = binary_search(sort_array,0,sort_array.size() - 1,random_array[i]);result.push_back(res);}return result;
}//在列表A中查找B列表中元素
int main() {int A[] = { -1, 2, 5, 20, 90, 100, 207, 800 };int B[] = { 50, 90, 3, -1, 207, 80 };std::vector<int> sort_array;std::vector<int> random_array;std::vector<int> C;for (int i = 0; i < 8; i++) {sort_array.push_back(A[i]);}for (int i = 0; i < 6; i++) {random_array.push_back(B[i]);}C = search_array(sort_array, random_array);for (int i = 0; i < C.size(); i++) {printf("%d\n", C[i]);}return 0;
}

循环实现

#include <stdio.h>
#include <vector>bool binary_search(std::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;
}std::vector<int> search_array(std::vector<int>& sort_array,std::vector<int>& random_array) {std::vector<int> result;for (int i = 0; i < random_array.size(); i++) {int res = binary_search(sort_array, random_array[i]);result.push_back(res);}return result;
}int main() {int A[] = { -1, 2, 5, 20, 90, 100, 207, 800 };int B[] = { 50, 90, 3, -1, 207, 80 };std::vector<int> sort_array;std::vector<int> random_array;std::vector<int> C;for (int i = 0; i < 8; i++) {sort_array.push_back(A[i]);}for (int i = 0; i < 6; i++) {random_array.push_back(B[i]);}C = search_array(sort_array, random_array);for (int i = 0; i < C.size(); i++) {printf("%d\n", C[i]);}return 0;
}

例1:插入位置(easy) (二分查找)

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

例2:区间查找(medium)(二分查找)

#include <vector>int left_bound(std::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 || nums[mid - 1] < target) {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(std::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 || nums[mid + 1] > target) {return mid;}begin = mid + 1;}else if (target < nums[mid]) {end = mid - 1;}else if (target > nums[mid]) {begin = mid + 1;}}return -1;
}class Solution {public:std::vector<int> searchRange(std::vector<int>& nums, int target) {std::vector<int> result;result.push_back(left_bound(nums, target));result.push_back(right_bound(nums, target));return result;}
};

例3:旋转数组查找(medium)(二分查找)

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

预备知识:二叉查找(排序)树基础知识

#include <stdio.h>
#include <vector>struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};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 preorder_print(TreeNode *node,int layer){if (!node){return;}for (int i = 0; i < layer; i++){printf("-----");}printf("[%d]\n", node->val);preorder_print(node->left, layer + 1);preorder_print(node->right, layer + 1);
}int main(){TreeNode root(8);std::vector<TreeNode *> node_vec;int test[] = {3, 10, 1, 6, 15};for (int i = 0; i < 5; i++){node_vec.push_back(new TreeNode(test[i]));}for (int i = 0; i < node_vec.size(); i++){BST_insert(&root, node_vec[i]);}preorder_print(&root, 0);return 0;
}

#include <stdio.h>
#include <vector>struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};bool BST_search(TreeNode *node, int value){if (node->val == value){return true;}if (value < node->val){if (node->left){return BST_search(node->left, value);}else{return false;}}else{if (node->right){return BST_search(node->right, value);}else{return false;}}
}int main(){TreeNode a(8);TreeNode b(3);TreeNode c(10);TreeNode d(1);TreeNode e(6);TreeNode f(15);a.left = &b;a.right = &c;b.left = &d;b.right = &e;c.right = &f;for (int i = 0; i < 20; i++){if (BST_search(&a, i)){printf("%d is in the BST.\n", i);}else{printf("%d is not in the BST.\n", i);}}return 0;
}

例4:逆序数(hard)(二叉查找树应用)

#include <stdio.h>
#include <vector>struct BSTNode {int val;int count;BSTNode* left;BSTNode* right;BSTNode(int x) : val(x), left(NULL), right(NULL), count(0) {}
};void BST_insert(BSTNode* node, BSTNode* insert_node, int& count_small) {if (insert_node->val <= node->val) {node->count++;if (node->left) {BST_insert(node->left, insert_node, count_small);}else {node->left = insert_node;}}else {count_small += node->count + 1;if (node->right) {BST_insert(node->right, insert_node, count_small);}else {node->right = insert_node;}}
}class Solution {public:std::vector<int> countSmaller(std::vector<int>& nums) {std::vector<int> result;std::vector<BSTNode*> node_vec;std::vector<int> count;//将初始数组逆置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;BST_insert(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. 数据结构与算法——二分查找与二叉排序树

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

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

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

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

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

  4. 数据结构与算法(C++)– 二叉查找树(Binary Search Tree )

    数据结构与算法(C++)– 二叉查找树(Binary Search Tree ) 1.二叉查找树(BST) 定义: 假设二叉树的节点都是不同的数,对于树点的任一节点,它的左子树都小于它,它的右子树都大 ...

  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. HTTP协议03-http特点及请求方式
  2. 2020年人工神经网络第二次作业-参考答案第五题
  3. Math.abs为Integer.Min_VALUE返回错误的值
  4. python京东注册账号_Python爬虫模拟登录京东获取个人信息
  5. mysql为字段值添加或者去除前缀、后缀(查询字段拼值)
  6. Drools 7.11 :入门程序
  7. LeetCode:安排工作以达到最大收益【455】
  8. [Ext JS6]路由(Routing)及使用
  9. idea2020更新功能_idea2020 插件备份
  10. 谷歌,IE,火狐浏览器内核
  11. Python 爬虫--网站下载器
  12. ios中常用英语单词汇总
  13. C# 实现蓝牙检测及蓝牙设备信息获取代码
  14. PIBOT移植ROS2记录(2)-添加Node与cmd_vel
  15. openrov,bluerov(树莓派代码)水下机器人树莓派、BBB板--组装自己的rov(准备篇)
  16. (转)证券公司私募(PB)整体服务
  17. 安卓逆向Xposed HOOK TB直播APP的x-sign参数
  18. 用双重for循环打印99乘法表
  19. 手机计算机怎么打出无限符号,Win7怎么用搜狗打无限符号|输入法打无限符号方法...
  20. 自述从被坑70000到开工作室月入100000+:我做自动项目这一年辛酸史!

热门文章

  1. 多进程参数args元组方式与kwargs字典方式
  2. mysql innodb 间隙锁_Mysql innodb 间隙锁
  3. hbase 和 zookeeper建立连接_我对Hbase的一些理解——HMaster与Zookeeper之间的交互机制...
  4. 二分图判定(涂色问题)
  5. 第 20 次 CSP认证 202009-5 密信与计数
  6. 【NIPS 2020】Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for...译读笔记
  7. 模式识别中常见概率符号公式的学习笔记 By Youki~
  8. c/c++教程 - 1.9 指针 空指针 野指针 const修饰指针 指针常量 常量指针 指针和数组 指针和函数
  9. TypeError: Cannot set properties of undefined (setting ‘innerHTML‘)
  10. 关于笔算递归的通用算法——迭代