LeetCode-探索-初级算法-树-5. 将有序数组转换为二叉搜索树(个人做题记录,不是习题讲解)
LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/
- 将有序数组转换为二叉搜索树
-
语言:java
-
思路:感觉和上一题的层层递归的有点像,再加上左右子树最多高度相差一,我就想说每次取数组中值当作当前树的根节点,左边当作左子树,右边当作右子树,有点二分查找的感觉。没想到一次过了,挺高兴的。
-
代码(1ms):
/** * 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) { return BST(nums); } public TreeNode BST(int[] nums){ int len = nums.length; if(len>0){ int middle = len/2; TreeNode node = new TreeNode(nums[middle]); node.left = BST(Arrays.copyOfRange(nums,0,middle)); node.right = BST(Arrays.copyOfRange(nums,middle+1,len)); return node; } return null; } }
-
参考代码(1ms):感觉和我的差别不大,只不过它改用下标来代替获取子数组的方式,而我是直接暴力获取子数组(如果测试数据很大,肯定参考代码的优势就明显了)
class Solution { public TreeNode sortedArrayToBST(int[] nums) { return toBST(nums, 0, nums.length - 1); } public TreeNode toBST(int[] nums, int i, int j) { if (i > j) { return null; } int mid = i + (j - i) / 2; TreeNode node = new TreeNode(nums[mid]); node.left = toBST(nums, i, mid - 1); node.right = toBST(nums, mid + 1, j); return node; } }
-
参考后重写:
/** * 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) { return BST(nums,0,nums.length-1); } public TreeNode BST(int[] nums,int start,int end){ if(end>=start){ int middle = start + (end-start)/2; TreeNode node = new TreeNode(nums[middle]); node.left = BST(nums,start,middle-1); node.right = BST(nums,middle+1,end); return node; } return null; } }