LeetCode108将有序数组转换为二叉搜索树(java)

  首先介绍一下,高度平衡的二叉搜索树是什么?
  
  高度平衡的二叉搜索树对每一个结点x,x的左子树与右子树的高度差(平衡因子)至多为1。
  
   再看这个题目,比较容易想到的方法就是递归了,因为对于左右子树而言,如果把他们分别看作一个树,左右子树拥有相同的结构,根节点,左右子树。因此,我们先提供一种常规的方法,首先确定根节点的值,为了保证左右子树的高度差至多为1,选择中间节点作为二叉树的根节点,然后左右节点依次类推。不多说,直接看代码,代码会更清楚
public TreeNode sortedArrayToBST(int[] nums) {
        return sortedArrayToBSTHelper(nums, 0, nums.length-1);
    }

    public TreeNode sortedArrayToBSTHelper(int[] nums, int low, int high) {
        if (low > high) {
            return null;
        }
        int middle = low + (high - low)/2;
        TreeNode root = new TreeNode(nums[middle]);
        root.left = sortedArrayToBSTHelper(nums, low, middle - 1);
        root.right = sortedArrayToBSTHelper(nums, middle + 1, high);
        return root;
    }

这样作答之后,AC是ok的,速度也差不多ok,就是占用的内存有点多

在这里插入图片描述
为了减少占用内存的情况,又想到一个办法,用到了之前学习到的一个函数,可以复制数组中的数据,Arrays提供的一个方法copyOfRange()。这个继续尝试一下。

利用arrays.copyofRange函数也是ok的,上代码:
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        if(nums.length == 0) {
            return null;
        }
        TreeNode root = new TreeNode(nums[nums.length/2]);
        root.left = sortedArrayToBST(Arrays.copyOfRange(nums, 0, nums.length/2));
        root.right = sortedArrayToBST(Arrays.copyOfRange(nums, nums.length/2+1, nums.length));
        return root;
    }
}

这种方法速度和占用内存真的是感人
在这里插入图片描述
探究了一下Arrays.copyOfRange() 这个函数的源码,很有意思,发现实际上是调用了System.arraycopy()函数。


public static int[] copyOfRange(int[] original, int from, int to) {
    int newLength = to - from;
    if (newLength < 0)
        throw new IllegalArgumentException(from + " > " + to);
    int[] copy = new int[newLength];
    System.arraycopy(original, from, copy, 0,
            Math.min(original.length - from, newLength));
    return copy;
}
然后就很疑惑,这两个函数的异同点,经过一番探究,了解一二:

这两个函数都是深拷贝,是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,不会受到原数组的影响变化。

具体使用上的区别,这位老哥描述的比较好,个人理解,是copy数据的方式不同,其他并无本质区别,依情况使用即可。
https://blog.csdn.net/xiaaiwu/article/details/52414740?fps=1&locationNum=5

这道题就先探究到这里吧,下次再去探究一下更有意思的~

猜你喜欢

转载自blog.csdn.net/weixin_45806131/article/details/107308689
今日推荐