654.最大二叉树

给定一个不重复的整数数组 nums最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边子数组前缀上 构建左子树。
  3. 递归地在最大值 右边子数组后缀上 构建右子树。

返回 nums 构建的最大二叉树

示例 1

treetree

1
2
3
4
5
6
7
8
9
10
11
12
输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
- 空数组,无子节点。
- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
- 空数组,无子节点。
- 只有一个元素,所以子节点是一个值为 1 的节点。
- [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
- 只有一个元素,所以子节点是一个值为 0 的节点。
- 空数组,无子节点。

Solution

常规解法算简单的,但是还有单调栈解法

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
34
35
36
37
class Solution {

// 公共方法,用于从数组构建最大二叉树。
public TreeNode constructMaximumBinaryTree(int[] nums) {
// 调用递归构造函数,传入整个数组及其范围。
return construct(nums, 0, nums.length - 1);
}

// 递归方法,用于在nums数组的指定范围[left, right]构建最大二叉树。
public TreeNode construct(int[] nums, int left, int right) {
// 如果左边界大于右边界,说明子数组为空,返回null。
if (left > right) {
return null;
}

// 寻找当前子数组中的最大值及其索引。
int best = left; // 从left开始,初始化最大值的索引。
for (int i = left + 1; i <= right; ++i) {
if (nums[i] > nums[best]) { // 如果发现更大的数,则更新索引。
best = i;
}
}

// 创建当前的根节点,其值为子数组的最大值。
TreeNode node = new TreeNode(nums[best]);

// 递归构建左子树,包含最大值左边的子数组。
node.left = construct(nums, left, best - 1);

// 递归构建右子树,包含最大值右边的子数组。
node.right = construct(nums, best + 1, right);

// 返回构建的节点。
return node;
}
}