题目:
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
- 二叉树的根是数组中的最大元素。
- 左子树是通过数组中最大值左边部分构造出的最大二叉树。
- 右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。
示例 :
提示:
给定的数组的大小在 [1, 1000] 之间。
题解:
步骤:
1.确定递归函数的参数和返回值
参数:存放元素的数组、最左边索引,最右边索引,这里采用左闭右开的原则
返回类型:TreeNode
2.确定终止条件
- 没有元素了:即right - left < 1,返回null
- 只有一个元素:即right - left == 1,创建节点
3.确定单层递归的逻辑
- 先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组
- 最大值所在的下标左区间 构造左子树
- 最大值所在的下标右区间 构造右子树
/**
* 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 constructMaximumBinaryTree(int[] nums) {
return construct(nums, 0, nums.length);
}
public TreeNode construct(int[] nums, int left, int right) {
if (right - left < 1) { //没有元素了
return null;
}
if (right - left == 1) { //只有一个元素
return new TreeNode(nums[left]);
}
int max = nums[left];
int maxIndex = left;
//左闭右开
for (int i = left + 1; i < right; i++) {
if (max < nums[i]) {
max = nums[i];
maxIndex = i;
}
}
TreeNode root = new TreeNode(max);
root.left = construct(nums, left, maxIndex);
root.right = construct(nums, maxIndex + 1, right); //分割点不需要,跳到下一个
return root;
}
}
参考:代码随想录