选择中点构造根节点然后递归构造左子树和右子树
因为递归时候要记录一个起始位置一个终止位置, 所以构造一个helper函数
注意中点被构造成root 所以递归带入是mid-1 和mid+1 所以边界条件是start > end
时间复杂度还是一次树遍历O(n),空间复杂度是栈空间O(logn)加上结果的空间O(n),所以额外空间是O(logn),总体是O(n)。
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode sortedArrayToBST(int[] num) { if (num == null || num.length == 0){ return null; } return helper(num, 0, num.length - 1); } private TreeNode helper(int[] num, int start, int end){ if (start > end){//因为是mid-1 和mid+1 所以到最后会出现start<end 而不是等于 return null; } int mid = (start + end)/2; TreeNode node = new TreeNode(num[mid]); node.left = helper(num, start, mid-1); node.right = helper(num, mid + 1, end); return node; } }
没有评论:
发表评论