题目
解题思路
先明确根节点做什么?** 对于构造二叉树的问题,根节点要做的就是把想办法把自己构造出来。**
我们肯定要遍历数组把找到最大值 maxVal
,把根节点 root
做出来,然后对maxVal
左边的数组和右边的数组进行递归调用,作为 root
的左右子树。
按照题目给出的例子,输入的数组为 [3,2,1,6,0,5],对于整棵树的根节点来说,其实在做这件事:
再详细一点,就是如下代码:
** 对于每个根节点,只需要找到当前 nums 中的最大值和对应的索引,然后递归调用左右数组构造左右子树即可。**
明确了思路,我们可以重新写一个辅助函数 build,来控制 nums 的索引:
代码
/**
* 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 build(nums,0,nums.length-1);
}
// 递归函数,参数1,需要创建的数组;参数2,最左侧位置;参数3,最右侧位置
public static TreeNode build(int[] nums,int lo,int hi){
//base case 递归跳出条件,左边索引超过右边
if(lo>hi){
return null;
}
//找到数组中的最大值和对应的索引
int index=-1,maxval=Integer.MIN_VALUE;
for(int i =lo;i<=hi;i++){
if(maxval<nums[i]){
index =i ;
maxval=nums[i];
}
}
//找到最大的值作为root节点
TreeNode root=new TreeNode(maxval);
//将root左边填充数组最左边到索引位置
root.left=build(nums,lo,index-1);
//将root右边填充索引到最右边索引位置
root.right=build(nums,index+1,hi);
//返回root节点
return root;
}
}