携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
舒舒服服的礼拜六,做个每日一题,香喷喷
最大二叉树
该题出自力扣的654题 —— 最大二叉树【中等题】
审题
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
- 递归地在最大值 左边 的 子数组前缀上 构建左子树。
- 递归地在最大值 右边 的 子数组后缀上 构建右子树。
- 返回 nums 构建的 最大二叉树 。
-
题意并不复杂,就是重新对二叉树数组排序,根据数组最大值重排二叉树,并且递归
-
直接就把实现方式放在题目里面了,需要递归,对数组的最大值的左边子数组和右边子数组依次放在左子树和右子树下
-
定义两个方法,一个作为递归的主方法,一个作为找出数组最大值的下标
-
找出数组的最大值的下标
- 定义两个变量,作为Integer型的内置最小值,和初始下标
- 循环找到更大值,并替换
-
递归的主方法
- 判断是否左下标大于 右下标
- 利用数组最大值的子方法,找到下标
- 构造出当前二叉树,并递归调用当前方法,作为左右子树
-
树的递归很多时候都可以套路解决,就一个模版,递归套路三部曲
- 找终止条件:当l>r时,说明数组中已经没元素了,自然当前返回的节点为null。
- 每一级递归返回的信息是什么
- 一次递归做了什么
编码
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return matchBig(nums,0,nums.length - 1);
}
public TreeNode matchBig(int[] nums,int l,int r){
if (l > r){
return null;
}
int bound = findBig(nums,l,r);
TreeNode root = new TreeNode(nums[bound]);
root.left = matchBig(nums,l,bound-1);
root.right = matchBig(nums,bound + 1,r);
return root;
}
public int findBig(int[] nums,int l,int r){
int max = Integer.MIN_VALUE,maxIndex = l;
for (int i = l; i <= r; i++) {
if (nums[i] > max){
max = nums[i];
maxIndex = i;
}
}
return maxIndex;
}
}