构造最大二叉树

654.最大二叉树

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

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

返回 nums 构建的 *最大二叉树*

示例 1:

img

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 的节点。
- 空数组,无子节点。

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000
  • nums 中的所有整数 互不相同

同构造二叉树,但每次选取的是左右区间的最大值

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
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return buildTree(nums, 0, nums.length-1);
}

public TreeNode buildTree(int[] nums, int left, int right){
if(right < left){
return null;
}
int max_index = left;//寻找分割点,即最大值所在的点
int max = nums[left];
for(int i = left + 1; i <= right; i++){
if(nums[i] > max){
max = nums[i];
max_index = i;
}
}
//以最大值建立树节点
TreeNode root = new TreeNode(nums[max_index]);
root.left = buildTree(nums, left, max_index-1); //构建左子树
root.right = buildTree(nums, max_index+1, right); //构建右子树
return root;
}

}

构造最大二叉树
http://example.com/2023/04/10/算法/二叉树/18. 构造最大二叉树/
作者
PALE13
发布于
2023年4月10日
许可协议