[leetCode]108.将有序数组转化为二叉搜索树

在这里插入图片描述

解法中序遍历-递归

选择不同的中间位置可以产生不同的高度平衡二叉搜索树

  • lo +(hi - lo)/2 或 (lo + hi)/2 选择中间位置左边数字作为根节点
    在这里插入图片描述
  • lo+(hi - lo)/2 + 1 或 (lo + hi +1)/2 选择中间位置右边数字作为根节点
    在这里插入图片描述
  • lo+(hi - lo)/2 + rand.nextInt(2) 或 (lo + hi +rand.nextInt(2))/2 选择中间位置任意数字作为根节点
  • 在这里插入图片描述
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        int mid =nums.length/2;
        if(nums.length == 0)return null;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = sortedArrayToBST(Arrays.copyOfRange(nums,0, mid));
        root.right = sortedArrayToBST(Arrays.copyOfRange(nums,mid+1, nums.length));
        return root;
    }
}

上面的递归用了Arrays.copyOfRange所以要慢,下面递归使用两个指针所以要快

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return dfs(nums, 0, nums.length-1);
    }

    public TreeNode dfs(int[] nums, int lo, int hi){
        if(hi<lo) return null;
        int mid = lo + (hi - lo)/2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = dfs(nums, lo, mid-1);
        root.right = dfs(nums, mid+1, hi);
        return root;
    }
}
posted @ 2020-07-07 10:37  消灭猕猴桃  阅读(68)  评论(0编辑  收藏  举报