链接: 原题在这
题目如下:
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
例子如下:
输入:nums = [3,2,1,6,0,5] 输出:[6,3,5,null,2,0,null,null,1] 解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
- 空数组,无子节点。
- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
- 空数组,无子节点。
- 只有一个元素,所以子节点是一个值为 1 的节点。
- [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
- 只有一个元素,所以子节点是一个值为 0 的节点。
- 空数组,无子节点。
读完题目和例子思路也浮出脑海了.
大体如下:
- 先找到最大值及其所在位置的索引
- 按照索引左边为左子树,右边为右子树(具体区间是左闭右开还是其他的要统一且理清楚)
- 然后就"来左边跟我递归一下,右边跟我递归一下"
代码如下:
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
//无非就是递归,
//然后每次从nums这边获得最大值的下标,同时new一个TreeNode
//递归函数
//1.递归函数的参数和返回值
//nums必须有,int begin,int end,返回值TreeNode
//2.递归的退出条件
//当begin>end的是时候
//3.单层递归的逻辑
return getNode(nums,0,nums.length);
}
public TreeNode getNode(int[]nums,int begin,int end){
//左闭右开
if(begin>=end){
return null;
}
int maxIndex=begin;
int max=nums[begin];
for (int i = begin+1 ; i < end; i++) {
if(nums[i]>max){
max=nums[i];
maxIndex=i;
}
}
TreeNode node=new TreeNode(max);
node.left=getNode(nums,begin,maxIndex);
node.right=getNode(nums,maxIndex+1,end);
return node;
}
}
你要是想迭代的话,会麻烦很多,所以这边就不展示迭代对应的代码了.
最后关于点赞收藏还有算法这些事,我想告诉你: