0654.最大二叉树
描述
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
- 二叉树的根是数组中的最大元素。
- 左子树是通过数组中最大值左边部分构造出的最大二叉树。
- 右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。
实例
输入: [3,2,1,6,0,5]
输出: 返回下面这棵树的根节点:
6
/ \
3 5
\ /
2 0
\
1
节点描述
//Definition for a binary tree node.
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
题解
- 根据
start
和end
获取当前需要创建的最大二叉树的数组片段 - 找到这一片段中的最大值和所在位置
maxIndex
- 如果
maxIndex != start
就将start
和maxIndex-1
作为新的片段坐标递归 - 如果
maxIndex != end
就将maxIndex+1
和end
作为新的片段坐标递归
public static TreeNode constructMaximumBinaryTree(int[] nums) {
return getMaxNode(nums,0,nums.length-1);
}
public static TreeNode getMaxNode(int[] nums,int start,int end){
if (start >= end)
return new TreeNode(nums[end]);
int max = Integer.MIN_VALUE;
int maxIndex = 0;
for (int i = start; i <= end; i++) {
if (max < nums[i]){
max = nums[i];
maxIndex = i;
}
}
TreeNode treeNode = new TreeNode(nums[maxIndex]);
if (maxIndex != start)
treeNode.left = getMaxNode(nums,start,maxIndex-1);
if (maxIndex != end)
treeNode.right = getMaxNode(nums,maxIndex+1,end);
return treeNode;
}