方法1: dfs-preorder traversal 。我们都知道如果inorder遍历bst,那么得到的将是一个递增的数列,也就是我们题目中给出的input。所以这道题我们也可以理解为:根据inorder traversal来construct 一个bst。其实这也是答案为什么不唯一的原因,因为inorder traversal并不能唯一化一个bst。言归正传,这题我们用dfs-preorder来做。时间复杂n,空间复杂n。我和lc的思路是一样的,但是他没有使用copyofrange这个函数,这个函数时间复杂好像也是n呢,他用的是传进两个参数,start,end,他这样比较巧妙。下面两种代码我都展示一下:
// 我的
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length == 0) return null;
TreeNode mid = new TreeNode(nums[nums.length/2]);
mid.left = sortedArrayToBST(Arrays.copyOfRange(nums,0,nums.length/2));
mid.right = sortedArrayToBST(Arrays.copyOfRange(nums,nums.length/2+1,nums.length));
return mid;
}
}
// lc的
class Solution {
int[] nums;
public TreeNode helper(int left, int right) {
if (left > right) return null;
// always choose left middle node as a root
int p = (left + right) / 2;
// preorder traversal: node -> left -> right
TreeNode root = new TreeNode(nums[p]);
root.left = helper(left, p - 1);
root.right = helper(p + 1, right);
return root;
}
public TreeNode sortedArrayToBST(int[] nums) {
this.nums = nums;
return helper(0, nums.length - 1);
}
}
总结:
- 无