22_最大二叉树
1.01_设计一个有getMin功能的栈2.02_由两个栈组成的队列3.03_如何仅用递归函数和栈操作逆序一个栈4.04_猫狗队列5.05_用一个栈实现另一个栈的排序6.06_用栈来求解汉诺塔问题7.07_用队列实现栈8.09_删除字符串中的所有相邻重复项9.08_ 有效的括号10.10_逆波兰表达式求值11.11_滑动窗口最大值12.12_前K个高频元素13.01_移除链表元素14.02_设计链表15.03_反转链表16.04_两两交换链表中的节点17.05_删除链表的倒数第N个节点18.06_链表相交19.07_环形链表20.01_二叉树的递归遍历21.二叉树理论基础22.02_二叉树的迭代遍历23.04_二叉树的层序遍历24.05_二叉树的层次遍历II25.06_二叉树的右视图26.07_二叉树的层平均值27.08_N叉树的层序遍历28.09_每个行中找最大值29.10_填充每个节点的下一个右侧节点指针30.11_二叉树的最大深度31.12_二叉树的最小深度32.13_翻转二叉树33.14_对称二叉树34.15_完全二叉树的节点个数35.16_平衡二叉树36.17_二叉树的所有路径37.18_左叶子之和38.19_找树左下角的值39.20_路径总和40.21_从中序与后序遍历序列构造二叉树
41.22_最大二叉树
42.23_合并二叉树43.24_二叉搜索树中的搜索44.27_二叉搜索树的众数45.28_二叉树的最近公共祖先46.29_二叉搜索树中的插入操作47.30_删除二叉搜索树中的节点48.31_修剪二叉搜索树49.32_将有序数组转换为平衡二叉搜索树50.33_把二叉搜索树转换为累加树51.动态规划理论52.01_斐波那契数列53.02_爬楼梯54.03_使用最小花费爬楼梯55.04_不同路径56.05_不同路径2(带障碍物版)57.06_整数拆分58.08_杨辉三角59.10_最后一块石头的重量60.09_分割等和子集61.74_搜索二维矩阵654. 最大二叉树
给定一个不重复的整数数组 nums
。 最大二叉树 可以用下面的算法从 nums
递归地构建:
- 创建一个根节点,其值为
nums
中的最大值。 - 递归地在最大值 左边 的 子数组前缀上 构建左子树。
- 递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums
构建的 *最大二叉树* 。
示例 1:

输入: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 的节点。
- 空数组,无子节点。
示例 2:

输入:nums = [3,2,1]
输出:[3,null,2,null,1]
[思路]
构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。
-
确定递归函数的参数和返回值
参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。
TreeNode constructMaximumBinaryTree(int[] nums);
-
确定终止条件
题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。
那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。 这表示一个数组大小是1的时候,构造了一个新的节点,并返回。
TreeNode node = new TreeNode(0); if (nums.length == 1) { node.val = nums[0]; return node; }
-
确定单层递归的逻辑
1、先要找到数组中最大的值和对应的下标,最大的值构造根节点,下标用来下一步分割数组。
int maxValue = 0; int maxValueIndex = 0; for (int i = 0; i < nums.length; i++) { if(nums[i] > maxValue) { maxValue = nums[i]; maxValueIndex = i; } } TreeNode root = new TreeNode(maxValue);
2、最大值所在的下标左区间构造左子树
这里要判断maxValueIndex > 0,因为要保证左区间至少有一个数值。
if (maxValueIndex > 0) { node.left = constructMaximumBinaryTree(nums, leftIndex, maxValueIndex); }
3、最大值所在的下标右区间构造右子树
判断maxValueIndex < (nums.size() - 1),确保右区间至少有一个数值。
if (maxValueIndex < (nums.size() - 1)) { node.right = constructMaximumBinaryTree(nums, maxValueIndex, nums.length); }
综合代码如下:
class Solution { public TreeNode constructMaximumBinaryTree(int[] nums) { return constructMaximumBinaryTree1(nums, 0, nums.length); } public TreeNode constructMaximumBinaryTree1(int[] nums, int leftIndex, int rightIndex) { if (rightIndex - leftIndex < 1) { // 没有元素了 return null; } if (rightIndex - leftIndex == 1) { //只有一个元素 return new TreeNode(nums[leftIndex]); } int maxIndex = leftIndex; // 最大值的数组下标 int maxValue = nums[maxIndex]; // 最大值 for (int i = leftIndex + 1; i < rightIndex; i++) { if (nums[i] > maxValue) { maxIndex = i; maxValue = nums[i]; } } TreeNode root = new TreeNode(maxValue); // 根据maxIndex划分左右子树 root.left = constructMaximumBinaryTree1(nums, leftIndex, maxIndex); root.right = constructMaximumBinaryTree1(nums, maxIndex + 1, rightIndex); return root; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理