题目描述:
标签:树
给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:
二叉树的根是数组 nums 中的最大元素。
左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。
右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。
返回有给定数组 nums 构建的 最大二叉树 。
代码:
思路分析:其实思路和之前的构造二叉树的两个题很像,思路详情见 从中序与后序遍历序列构造二叉树 和 从前序与中序遍历序列构造二叉树
总思路:找到最大值作为分隔节点,分为左子树和右子树区间,然后递归
1、递归结束条件,begin==end,说明为空,返回null
2、遍历寻找区间最大值对应的下标maxIndex和最大值max
3、分隔区间,左区间为[begin,maxIndex),有区间为[maxIndex+1,end)
4、root.left=递归(左区间)
root.right=递归(右区间)
5、返回root
/**
* 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 traversal(nums,0,nums.length);
}
public TreeNode traversal(int[] nums,int begin,int end){
if(begin == end) return null;
int maxIndex = 0;
int max = Integer.MIN_VALUE;
for(int i = begin;i < end;i++){
if(nums[i] > max) {
maxIndex = i;
max = nums[i];
}
}
TreeNode root = new TreeNode(nums[maxIndex]);
int leftBegin = begin;
int leftEnd = maxIndex;
int rightBegin = maxIndex + 1;
int rightEnd = end;
root.left = traversal(nums,leftBegin,leftEnd);
root.right = traversal(nums,rightBegin,rightEnd);
return root;
}
}