L108 将有序数组转换为二叉搜索树
GitHub 账户:LuvnJoae 欢迎关注! https://github.com/LuvnJoae
GitHub 代码链接:https://github.com/LuvnJoae/Java_leetcode
思路与结果
代码思路1
package Day21_8_30.L108;
import java.util.Arrays;
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){
val = x;
}
}
/**
* 思路一
1. 通过递归思路,与二分切片
2. 将数组的中间值,作为root节点,通过copyOfRange进行切片,分成左右两个数组,对应root节点下的两个左右子树的全体内容。
3. 通过递归,将左右数组传递进去,再次将两个数组的中间值左右子树的根节点,依次递归。
4. 当左右数组的长度为1时,代表为最下面一个子节点了,则将这个节点赋值,然后左右字数赋null,返回该节点。
5. 如果左右数组有一为空的话,即数组长度为0,那么返回null作为空节点。
反思
1. 判断一个数组是否为空
a.
b. 和之前判断列表是否为空需要
If( list == null || list.isEmpty())
c. 一个道理
*/
public class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if (nums == null || nums.length == 0) {
return null;
}
if (nums.length == 1){
TreeNode root = new TreeNode(nums[0]);
root.left = null;
root.right = null;
return root;
}
int med = nums.length / 2;
TreeNode root = new TreeNode(nums[med]);
int[] numsLeft = Arrays.copyOfRange(nums, 0, med);
int[] numsRight = Arrays.copyOfRange(nums, med+1, nums.length);
root.left = sortedArrayToBST(numsLeft);
root.right = sortedArrayToBST(numsRight);
return root;
}
}
代码思路2
package Day21_8_30.L108;
import java.util.Arrays;
/**
* 思路二
1. 与思路一相同,区别是将 == 1 的判断去掉了,因为这种情况,走到下面分左右数组的时候,左右数组在分割的过程中其实就已经是空数组了(注意不是null ,而是{ }即length==0),这样通过递归终止条件,也是可以判断的的。
反思
1. 实际运行效果和思路1一样的。只是简化了代码而已
*/
public class Solution2 {
public TreeNode sortedArrayToBST(int[] nums) {
if (nums == null || nums.length == 0) {
return null;
}
int med = nums.length / 2;
TreeNode root = new TreeNode(nums[med]);
int[] numsLeft = Arrays.copyOfRange(nums, 0, med);
int[] numsRight = Arrays.copyOfRange(nums, med+1, nums.length);
root.left = sortedArrayToBST(numsLeft);
root.right = sortedArrayToBST(numsRight);
return root;
}
}
代码思路3
package Day21_8_30.L108;
/**
* 思路三
1. 还是递归思路,与思路一、二思想类似,但是前两个思路因为频繁创建新的数组,并且调用Arrays方法进行数组的分割,所以时间上会长一点,那么根据这个耗时点,联想到其实我们并不需要创建新的数组,直接在原数组nums的基础上进行操作也是可以的,我们只是用到了里面的值,并不作更改。所需要的,就是二分的坐标。
2. 通过创建一个新方法,传递start和end下标,递归,避免了创建两个新数组的耗时。
反思
1. 耗时减少,但复杂度其实没变。还是O(n)
2. 对于/2这种操作,可以用移位来进行,更简便。
a. >>>:无符号右移
i. 正数高位补零,负数补1
b. >>:有符号右移
都补零
*/
public class Solution3 {
public TreeNode sortedArrayToBST(int[] nums) {
return method(nums, 0, nums.length);
}
private TreeNode method(int[] nums, int start, int end){
if (start == end) {
return null;
}
int mid = (start + end) >>> 1;
TreeNode root = new TreeNode(nums[mid]);
root.left = method(nums, start, mid);
root.right = method(nums, mid+1, end);
return root;
}
}