给定一个不重复的整数数组 nums
。 最大二叉树 可以用下面的算法从 nums
递归地构建:
- 创建一个根节点,其值为
nums
中的最大值。 - 递归地在最大值 左边 的 子数组前缀上 构建左子树。
- 递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums
构建的 最大二叉树 。
示例 1:
输入: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 的节点。 - 空数组,无子节点。
示例 2:
输入:nums = [3,2,1] 输出:[3,null,2,null,1]
提示:
1 <= nums.length <= 1000
0 <= nums[i] <= 1000
nums
中的所有整数 互不相同
思路:
通过递归构建最大二叉树。
- 递归的返回结果是一个 TreeNode 节点, 传入参数为 nums, leftIndex, rightIndex。采用左闭右开。
- 递归的终止条件是 rightIndex - leftIndex < 1,此时说明在 [ leftIndex,rightIndex) 范围内没有节点了,返回 null 。当 rightIndex - leftIndex == 1 时,说明此时在 [ leftIndex, rightIndex) 范围内有一个节点,其值为 nums[ leftIndex],故 返回 new TreeNode(nums[ leftIndex]);
- 递归的单层处理逻辑是 先找到 [ leftIndex,rightIndex) 范围内中最大值 maxVal 和最大值的下标 maxIndex,创建一个 TreeNode root = new TreeNode(maxVal); maxIndex 将 nums 数组分成三个部分,第一部分是 [ leftIndex, maxIndex),即 root 的左子树,第二部分是 root, 第三部分是 [ maxIndex+1,rightIndex),即 root 的右子树。然后将 [ leftIndex, maxIndex) 内的 nums 值 放进递归函数,得到这棵左子树的根节点, 设置为 root.left 。将 [ maxIndex+1,rightIndex) 内的 nums 值 放进递归函数,得到这棵右子树的根节点, 设置为 root.right 。最后返回 root 。
代码:
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return constructMaximumBinaryTree1(nums,0,nums.length);
}
//左闭右开,可以取到 nums 数组中位于下标 leftIndex 的值
//不可以取到 nums 数组中位于下标 rightIndex 的值
public TreeNode constructMaximumBinaryTree1(int[] nums,int leftIndex,int rightIndex){
if(rightIndex-leftIndex<1){//说明此时没有节点了
return null;
}
if(rightIndex-leftIndex==1){//说明此时有一个节点
return new TreeNode(nums[leftIndex]); //rightIndex 取不到
}
int maxVal = nums[leftIndex];
int maxIndex = leftIndex;
for(int i=leftIndex+1;i<rightIndex;i++){
if(nums[i]>maxVal){
maxVal = nums[i];
maxIndex = i;
}
}
TreeNode root = new TreeNode(maxVal);
root.left = constructMaximumBinaryTree1(nums,leftIndex,maxIndex);
root.right = constructMaximumBinaryTree1(nums,maxIndex+1,rightIndex);
return root;
}
}
参考:代码随想录