• Java递归加上二分搜索将有序数组转化为平衡二叉树2


    二分查找的例子:为下文做铺垫:

    c++:

    lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

    upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

    class Solution {
    public:
    int searchInsert(vector<int>& nums, int target) {
    return lower_bound(nums.begin(),nums.end(),target)-nums.begin();
     }
    };

    java:

    class Solution {
    public int searchInsert(int[] nums, int target) {
    return toBST(nums,0,nums.length-1,target);
    }
    public int toBST(int[]nums,int left,int right,int target)
    {
    if(left>right)return left;
    int mid=(int)(left+right)/2;
    if(target==nums[mid])return mid;
    if(target>nums[mid])return toBST(nums,mid+1,right,target);
    if(target<nums[mid])return toBST(nums,left,mid-1,target);
    return mid;
    }
    }

    -------------------->Java递归加上二分搜索将有序数组转化为平衡二叉树

    class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
    return ToBST(nums,0,nums.length-1);
    }
    public static TreeNode ToBST(int nums[],int left,int right){
    if(left>right)return null;//定义的二分区间为[left,right],无法进行继续递归,直接退出
    int mid = (int)(left+right)/2;//二分中值
    TreeNode root = new TreeNode(nums[mid]);
    root.left = ToBST(nums,left,mid-1);//注意mid-1 对左半部分进行递归
    root.right = ToBST(nums,mid+1,right);//注意mid+1 对右半部分进行递归
    return root;
    }
    }

  • 相关阅读:
    python_linux系统相关配置
    python_字典dict相关操作
    python_传参
    mapreduce 学习笔记
    linux 常用命令
    C++ stringstream介绍,使用方法与例子
    C++/C++11中std::numeric_limits的使用
    C++中string erase函数的使用
    C++中accumulate的用法
    malloc的用法和意义
  • 原文地址:https://www.cnblogs.com/z2529827226/p/11746445.html
Copyright © 2020-2023  润新知