题目:
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
二叉树的根是数组中的最大元素。
左子树是通过数组中最大值左边部分构造出的最大二叉树。
右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。
Example 1:
输入: [3,2,1,6,0,5]
输入: 返回下面这棵树的根节点:
6
/ \
3 5
\ /
2 0
\
1
所用语言:Java
下面是代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
TreeNode root = buildTree(nums,0,nums.length-1);
return root;
}
public TreeNode buildTree(int[] nums, int start, int end){
int index = start;
TreeNode tree = new TreeNode(nums[index]);
//找出最大元素的下标
for(int i=start; i<=end; i++){
if(nums[index] < nums[i]){
index = i;
}
}
tree.val = nums[index];
if(index > start){
tree.left = buildTree(nums,start,index-1);
}
if(index < end){
tree.right = buildTree(nums,index+1,end);
}
return tree;
}
}
思路:
通过题目我们可以知道最大二叉树的根是这个数组中的最大值。
那么很明显首先我们要找出这个数组中的最大值,找到最大值之后就可以构建这棵树的根节点。
然后把最大值左边部分拿来构造一个最大二叉树当作此根节点的左子树。右子树同理。在构建左右最大子树时,就会意识到其实用递归可以解决这个问题。
递归的结束条件就是当只有一个节点时就直接返回,递归的前进条件就是还可以构建子树时就继续调用。