二分查找法及二分搜索树及其C++实现

  • 二分查找法
    • 二分查找简介
    • 二分查找的实现
  • 二分搜索树
    • 二分搜索树简介
    • 二分搜索树的实现

二分查找法

二分查找简介

二分查找是一种在每次比较之后将查找空间一分为二的算法。每次需要查找集合中的索引或元素时,都应该考虑二分查找。如果集合是无序的,我们可以总是在应用二分查找之前先对其进行排序。
二分查找一般由三个主要部分组成:
1.预处理:如果集合未排序,则进行排序。
2.二分查找:使用循环或递归在每次比较后将空间划分为两半。
3.后处理:在剩余空间确定可行的候选者。
二分查找的时间复杂度为O(log(n))。

二分查找的实现

#include<vector>
#include<assert.h>
using namespace std;
template<typename T>
int binaryserach(vector<T> vec,T target)
{int n = vec.size();if(n == 0)return -1;int l = 0;int r = n - 1;while (l <= r){int mid = l + (r - l) / 2;//使用这种形式可以避免int类型的溢出if (vec[mid] == target)return mid;if (vec[mid] < target)l = mid + 1;if (vec[mid] > traget)r = mid - 1;}return -1; //查找失败则返回-1
}

二分搜索树

二分搜索树简介

二分搜索树(BST)是二叉树的一种特殊表现形式,满足如下特性:

  1. 每个节点中的值必须大于(或等于)存储在其左子树中的任何值。
  2. 每个节点中的值必须小于(或等于)存储在其右子树中的任何值。

    二分搜索树的查找、插入、删除操作的时间复杂度均为O(log(n))。

二分搜索树的实现

此二分搜索树为不含重复键值的实现方式,若需要重复键值,可在相应实现细节处将小于条件改成小于等于或者将大于改成大于等于。

#ifndef BST_H
#define BST_H
#include<assert.h>
#include<iostream>
#include<queue>
using namespace std;
template<typename Key, typename Value>
class BST
{public:BST() : root(nullptr),count(0) {}~BST() //析构函数{destroy(root);}int size() //返回二分搜索树中节点数量{return count;}bool empty() //判断二分搜索树是否为空{return count == 0;}void insert(Key key, Value value) //在树中插入一个节点{root = insert(root, key, value);}bool contain(Key key) //判断当前树中是否包含该键值{return contain(root, key);}Value* serach(Key key) //在树中寻找指定键值,并返回该键值出的存储值{return serach(root, key);}void preOrder() //前序遍历树{preOrder(root);}void inOrder() //中序遍历树{inOrder(root);}void postOrder() //后序遍历树{postOrder(root);}void levelOrder() //层序遍历树{queue<Node*> qu;qu.push(root);while (!qu.empty()){Node* tmp = qu.front();qu.pop();cout << tmp->key << endl;  //执行打印键值操作,可执行其他操作if(tmp->left!=nullptr)qu.push(tmp->left);if(tmp->right!=nullptr)qu.push(tmp->right);}}Key maxkey() //返回数中最大键值{assert(count != 0);Node* maxNode = maxkey(root);return maxNode->key;}Key minkey() //返回树中最小键值{assert(count != 0);Node * minNode = minkey(root);return minNode->key;}void removeMin() //删除树中最小键值{if (root)root = removeMin(root);}void removeMax() //删除树中最大键值{if (root)root = removeMax(root);}void remove(Key key) //删除树中指定键值 {root = remove(root, key);}
private:struct Node  //二分搜索树节点定义{Key key;Value value;Node* left;Node* right;Node(Key key,Value value) : key(key),value(value),left(nullptr),right(nullptr) {}   //节点构造函数Node(Node* node) : key(node->key),value(node->value),left(node->left),right(node->right) {} //节点构造函数};Node* root; //二分搜索树根结点int count; //二分搜索树中节点数量//以下为相应的递归辅助函数void destroy(Node* node){if (node == nullptr)return;destroy(node->left);destroy(node->right);delete node;count--;}Node* insert(Node* node, Key key, Value value){if (node == nullptr){Node* newnode = new Node(key, value);count++;return newnode;}if (key < node->key)node->left = insert(node->left, key, value);if (key > node->key)node->right = insert(node->right, key, value);if (key == node->key)node->value = value;return node;}bool contain(Node* node, Key key){if (node == nullptr)return false;if (node->key == key)return true;if (node->key < key)return contain(node->right, key);if (key < node->key)return contain(node->left, key);}Value* serach(Node* node, Key key){if (node == nullptr)return nullptr;if (node->key == key)return &(node->value);if (node->key < key)return serach(node->right, key);if (key < node->key)return serach(node->left, key);}void preOrder(Node* node){if (node == nullptr)return;cout <<  node->key << endl; //执行打印键值操作,可执行其他操作preOrder(root->left);preOrder(root->right);}void inOrder(Node* node){if (node == nullptr)return;inOrder(node->left);cout << node->key << endl; //执行打印键值操作,可执行其他操作inOrder(node->right);}void postOrder(Node* node){if (node == nullptr)return;postOrder(node->left);postOrder(node->right);cout << node->key << endl; //执行打印键值操作,可执行其他操作}Node* maxkey(Node* node){if (node->right == nullptr)return node;return maxkey(node->right);}Node* minkey(Node* node){if (node->left == nullptr)return node;return minkey(node->left);}Node* removeMin(Node* node){if (node->left == nullptr){Node* rightnode = node->right;delete node;count--;return rightnode;}node->left = removeMin(node->left);return node;}Node* removeMax(Node* node){if (node->right == nullptr){Node* leftnode = node->left;delete node;count--;return leftnode;}node->right = removeMax(node->right);return node;}Node* remove(Node* node, Key key){if (node == nullptr)return node;if (node->key < key){node->right = remove(node->right, key);return node;}else if (key < node->key){node->left = remove(node->left, key);return node;}else{if (node->left == nullptr){Node* rightnode = node->right;delete node;count--;return rightnode;}if (node->right == nullptr){Node* leftnode = node->left;delete node;count--;return leftnode;}Node* newnode = new Node(minkey(node->right));count++; //创建了一个新结点先将节点数量+1,因为下一步的删除指定子树最小节点的函数会将节点数量-1newnode->right = removeMin(node->right);newnode->left = node->left;delete node;count--;return newnode;}}
};
#endif

二分查找法及二分搜索树及其C++实现相关推荐

  1. c语言 二分查找法 及二分查找法的时间复杂度。

    二分查找法是用来查找数组中指定的那个元素.使用二分查找的前提是数组是有序的.(这里我们假设是升序) 在现实生活中,我们要猜一个区间内的数字,比如1~10之间,我们通常会猜它的中间数5,再根据要猜的数和 ...

  2. 二分查找法之GGBond版

    文章目录 一.什么是二分查找法? 二.使用思路 题目:利用二分查找法,查找一个有序整数数组中的目标值的下标. 一.什么是二分查找法? 二分查找法又称折半查找法,是一种在有序整数数组中查找目的元素的一种 ...

  3. 经典算法之二分查找法(俗称基本二分搜索法)

    经典算法之二分查找法(俗称二分搜索法) 文章目录 经典算法之二分查找法(俗称二分搜索法) 前言 一.什么是二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的是数学+思维+逻辑+数据结构 ...

  4. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  5. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

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

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

  7. 每天5分钟玩转python3算法:二分查找法

    从今天开始,博主准备开始一段常见算法的学习,算法实现使用Python3,希望坚持下去^_^ alg1:二分查找法 1.运行时间 二分查找相比于依次查找,查询速度提升明显: + 依次查找:O(n) + ...

  8. java for循环和数组--冒泡排序、二分查找法

    //100以内与7相关的数 for(int a=1;a<=100;a++){     if(a%7==0||a%10==7||a/10==7){      System.out.print(a+ ...

  9. 学习练习 java 二分查找法

    1 package com.hanqi; 2 3 import java.util.*; 4 5 public class Test5 { 6 7 public static void main(St ...

最新文章

  1. 【基本操作】主席数统计区间不同颜色个数
  2. 在UE4中创建CG动画 How to create a movie in Unreal Engine 4 using Metahuman
  3. MyEclipse的Java Web项目配置环境搭建-如何安装tomact
  4. Windows核心编程 第26章 窗口消 息
  5. java责任链模式做优惠_Java设计模式菜鸟系列(十八)责任链模式建模与实现
  6. jQuery库中的变量$和其它类库的变量$冲突解决方案
  7. [洛谷P3292][SCOI2016]幸运数字
  8. 十大最受欢迎蓝牙耳机品牌推荐,学生党打工人平价蓝牙耳机
  9. 维护通讯录的方法及群组通讯录 管理平台
  10. SQLyog的下载与安装
  11. Web前端实战:管理系统网页的初步设计
  12. Mysql - 巧用join来优化sql
  13. 乐山持点科技:抖音极速版电商入驻指南
  14. vue中路由按需加载的几种方式
  15. 讲一点有技术含量的东西(一)
  16. 题69.x 的平方根
  17. linux命令行怎么结束进程,linux结束进程命令
  18. PIN PUK1
  19. eas数据库 oracle,EAS数据库还原通用操作
  20. 微机原理与接口技术(第6版)第六章习题1、3、10、13

热门文章

  1. windows下修改中用户名为英文
  2. 特征点检测和特征点匹配(ORB)
  3. shell一键部署mysql
  4. js控制form提交
  5. 金德的齐瓦,能否成为金德的温格?_原水_新浪博客
  6. 小白开发微信小程序52--测试小程序
  7. 快速傅里叶变换使用方法
  8. 谷歌浏览器打开显示2345浏览器界面
  9. 组合数的几种常规求法
  10. 当易方达张坤遇招商白酒侯昊