1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
static class Node {
int low, up;
TreeNode node;

Node(int low, int up, TreeNode node) {
this.low = low;
this.up = up;
this.node = node;
}
}

public TreeNode sortedArrayToBST(int[] nums) {
TreeNode root = new TreeNode();
Stack<Node> stack = new Stack<>();
stack.push(new Node(0, nums.length - 1, root));
while (!stack.isEmpty()) {
Node currNode = stack.pop();
int middle = currNode.low + (currNode.up - currNode.low) / 2;
currNode.node.val = nums[middle];
if (currNode.low <= middle - 1) {
currNode.node.left = new TreeNode();
stack.push(new Node(currNode.low, middle - 1, currNode.node.left));
}

if (currNode.up >= middle + 1) {
currNode.node.right = new TreeNode();
stack.push(new Node(middle + 1, currNode.up, currNode.node.right));
}
}
return root;
}
}

这个是iterative solution. 把一个新node和这个node所在范围封装成一个Node类, 我们用栈去存. pop出来一个, 我们就赋值然后继续看它的children在不在合理的range里面.

时间复杂度: O(n)
空间复杂度: O(n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return helper(nums, 0, nums.length - 1);
}

private TreeNode helper(int[] nums, int left, int right) {
if (left > right)
return null;
int middle = left + (right - left) / 2;
TreeNode newNode = new TreeNode(nums[middle]);
newNode.left = helper(nums, left, middle - 1);
newNode.right = helper(nums, middle + 1, right);
return newNode;
}
}

递归解法.
时间复杂度: O(n)
空间复杂度: O(logn)