[算法]各种二叉搜索

1,给定一个有序数组values,求任意一个i使得values[i]等于v,不存在返回-1

int search(int* values,int len,int key)
{
    if(!values || len <=0) return -1;
    int low=0;
    int high=len-1;
    while(low<=high)
    {
        int mid =(low+high)/2;
        if(values[mid]==key) return mid;
        else if(values[mid]>key) high=mid-1;
        else low = mid +1;
    }
    return -1;
}

2,给定一个有序数组values,求最小的i使得values[i]等于v,不存在返回-1

int searchFirst(int * values,int len,int key)
{
    if(!values || len <=0) return -1;
    int low=0;
    int high=len-1;
    while(low<=high)
    {
        int mid =(low+high)/2;
        if(values[mid]==key)
        {
            if(mid==0) return mid;
            else if(values[mid-1]<key) return mid;
            else high=mid-1;
        }
        else if (values[mid]>key) high=mid-1;
        else low=mid+1;
    }
    return -1;
}

3,给定一个有序数组values,求最大的i使得values[i]等于v,不存在返回-1

int searchLast(int* values,int len,int key)
{
    if(!values || len <=0) return -1;
        int low=0;
        int high=len-1;
        while(low<=high)
        {
            int mid =(low+high)/2;
            if(values[mid]==key)
            {
                if(mid==len-1) return mid;
                else if(values[mid+1]>key) return mid;
                else low=mid+1;
            }
            else if (values[mid]>key) high=mid-1;
            else low=mid+1;
        }
    return -1;
}

4,给定一个有序数组values,求最大的i使得values[i]小于v,不存在返回-1

int searchLargestSmallThan(int* values,int len,int key)
{
    if(!values || len <=0) return -1;

    int low=0,high=len-1;
    while(low <= high){
        int mid = (low+high)/2;
        if(values[mid]>=key) high=mid-1;
        else{
            if(mid<len-1 && values[mid+1]>=key) return mid;
            else
                low=mid+1;
        }
    }
    return -1;
}

4,给定一个有序数组values,求最小的i使得values[i]大于v,不存在返回-1

int searchSmallestLargeThan(int* values, int len,int key)
{
    if(!values || len <=0) return -1;
    int low=0,high=len-1;
    while(low <= high){
        int mid = (low+high)/2;
        if(values[mid]<=key) low=mid+1;
        else{
            if(mid>0 && values[mid-1]<=key) return mid;
            else
                high=mid-1;
        }
    }
    return -1;
}
时间: 2024-10-28 23:34:31

[算法]各种二叉搜索的相关文章

算法dfs——二叉搜索树中最接近的值 II

901. 二叉搜索树中最接近的值 II 中文 English 给定一棵非空二叉搜索树以及一个target值,找到 BST 中最接近给定值的 k 个数. 样例 样例 1: 输入: {1} 0.000000 1 输出: [1] 解释: 二叉树 {1},表示如下的树结构: 1 样例 2: 输入: {3,1,4,#,2} 0.275000 2 输出: [1,2] 解释: 二叉树 {3,1,4,#,2},表示如下的树结构: 3 / 1 4 2 挑战 假设是一棵平衡二叉搜索树,你可以用时间复杂度低于O(n)

算法导论第十二章__二叉搜索数

package I第12章__二叉搜索树; //普通二叉树 public class BinaryTree<T> { // -----------------------数据结构--------------------------------- private int height = 0; private Node<T> rootNode; class Node<T> { T t; int key; Node left; Node right; public Node

二叉搜索树中的常用方法

1 package Tree; 2 3 import org.junit.Test; 4 5 class TreeNode { 6 7 int val = 0; 8 TreeNode left = null; 9 TreeNode right = null; 10 11 public TreeNode(int val) { 12 this.val = val; 13 14 } 15 16 } 17 18 public class BinarySearchTree { 19 20 /** 21 *

[Swift]LeetCode450. 删除二叉搜索树中的节点 | Delete Node in a BST

Given a root node reference of a BST and a key, delete the node with the given key in the BST. Return the root node reference (possibly updated) of the BST. Basically, the deletion can be divided into two stages: Search for a node to remove. If the n

二叉树进阶之寻找一棵二叉树中的最大二叉搜索子树

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6618915.html  (规律:在二叉树中寻找某性质的,都应该以递归思维:从根结点开始递归左右,一直到底,由底向上返回的信息来判断当前结点.求当前结点.即:二叉树的题目,从下往上想,递归的返回过程就是从下往上由叶到根建立二叉树的过程,在此过程中对每一步的"根"结点作性质判断,返回到根时即是整棵树的性质判断了) 从一棵树中寻找结点数最多的二叉搜索子树,并返回这棵子树的头结点. 从题目我们知道以下要求

二叉搜索树算法详解与Java实现

二叉查找树可以递归地定义如下,二叉查找树或者是空二叉树,或者是满足下列性质的二叉树: (1)若它的左子树不为空,则其左子树上任意结点的关键字的值都小于根结点关键字的值. (2)若它的右子树不为空,则其右子树上任意结点的关键字的值都大于根节点关键字的值. (3)它的左.右子树本身又是一个二叉查找树. 从性能上来说如果二叉查找树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么二叉查找树的搜索性能逼近二分查找:但它比连续内存空间的二分查找的优点是,改变二叉查找树结构(插入与删除结点)不需

算法导论—二叉搜索树(BST)

华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/9/9 与散列表一样,搜索树数据结构也支持动态集合操作,包含插入,查询,删除,最小值,最大值,前驱,后继等. 一.二叉搜索树: 二叉搜索树节点:关键字key,卫星数据,左孩子指针,右孩子指针,父节点指针,其他特殊类型(红黑树的节点颜色,AVL树的树高等). 二叉搜索树性质:x是二叉搜索树中的任意一个节点.若y是x左子树中任意一个节点有x.key>=y.key.若y是x右子树中任意一个节点有x.key<=y.key. 二.二叉搜索树的

70 数组的Kmin算法和二叉搜索树的Kmin算法对比

[本文链接] http://www.cnblogs.com/hellogiser/p/kmin-of-array-vs-kmin-of-bst.html [分析] 数组的Kmin算法和二叉搜索树的Kmin算法非常类似,其本质是找序列中的第K大或者第K小的元素,可以借鉴QuickSort的思想加以实现. [Kmin_of_Array] C++ Code 1234567891011121314151617181920212223242526272829303132333435363738394041

[LeetCode] 285. Inorder Successor in BST 二叉搜索树中的中序后继节点

Given a binary search tree and a node in it, find the in-order successor of that node in the BST. Note: If the given node has no in-order successor in the tree, return null. 给一个二叉搜索树和它的一个节点,找出它的中序后继节点,如果没有返回null. 解法1: 用中序遍历二叉搜索树,当找到root.val = p.val的时