题目:
给定一个不重复的整数数组 nums
。 最大二叉树 可以用下面的算法从 nums
递归地构建:
- 创建一个根节点,其值为
nums
中的最大值。 - 递归地在最大值 左边 的 子数组前缀上 构建左子树。
- 递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums
构建的 最大二叉树 。
代码:
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return binaryTree(nums,0,nums.length-1);
}
//这里区间统一写成左闭右闭区间
public TreeNode binaryTree(int[] nums,int startIndex,int endIndex){
//终止条件 -- 区间中没有元素,返回空子树
if(startIndex > endIndex){
return null;
}
//单层递归逻辑
//1、找到最大值索引
int index = maxElementIndex(nums,startIndex,endIndex);
//2、构建节点
TreeNode root = new TreeNode(nums[index]);
//3、构建左子树的区间 [startIndex,index-1] 构建右子树的区间 [index+1,endIndex]
//4、递归左子树的区间 右子树的区间
root.left = binaryTree(nums,startIndex,index-1);
root.right =binaryTree(nums,index+1,endIndex);
return root;
}
//寻找给定区间中数组最大值下标
public int maxElementIndex(int[] nums,int startIndex,int endIndex){
int maxIndex = startIndex;
for(int i = startIndex;i<=endIndex;i++){
if(nums[maxIndex]<nums[i]){
maxIndex = i;
}
}
return maxIndex;
}
}