最大二叉树
题目详细:LeetCode.654
这道题在题目几乎就说明了解题的思路了:
- 创建一个根节点,其值为 nums 中的最大值;
- 递归地在最大值左边的子数组上构建左子树;
- 递归地在最大值右边的子数组上构建右子树;
- 返回 nums 构建的 最大二叉树 。
显而易见,我可以把构建最大二叉树这个大问题,划分为一个个小问题,当每一棵子树都按照上述思路来构建,那么整体就构成了一棵最大二叉树,小问题思路如下:
- 数组 nums 有三种情况:
- 数组长度为0:说明节点序列为空,返回 null
- 数组长度为1:说明只有一个节点,构建并返回节点
- 数组长度 > 1:找出最大值来构建当前节点
- 找出nums中的最大值,以及最大值的下标
- 按照要求,通过最大值的下标来划分构建左右子树的子数组
- 左子树通过最大值左边的子数组来构建
- 右子树通过最大值右边的子数组来构建
递归从根节点开始到左右子树构建子树,最后返回构建完成的根节点。
Java解法(递归,深度优先遍历):
class Solution {
public int findMaxIndex(int[] nums){
int res = -1, max = -1;
for(int i = 0; i < nums.length; i++){
if(max < nums[i]){
max = nums[i];
res = i;
}
}
return res;
}
public TreeNode constructMaximumBinaryTree(int[] nums) {
if(nums.length == 0)
return null;
if(nums.length == 1)
return new TreeNode(nums[0]);
int max_i = this.findMaxIndex(nums);
TreeNode root = new TreeNode(nums[max_i]);
root.left = this.constructMaximumBinaryTree(Arrays.copyOfRange(nums, 0, max_i));
root.right =