题目描述
我的解法
思路
本题与通过后序与中序构造二叉树的题目有些相似,只不过把递归通过两种顺序查找节点的过程变成了寻找数组最大值,不过不同的是构造二叉树可以通过构造HashMap降低寻找节点的时间,最大值则不行。但是用一开始时间复杂度为O(n)的算法只要稍加修改把查找中序中符合条件的节点变成查找最大值节点即可。
递归三要素:
- 返回值与参数:返回值为构造的新节点,参数有当前访问的参数,左或右子树数组
- 终结条件:递归过程中当前数组为空时,返回null
- 单层递归逻辑:
(1)获取当前数组中最大值的值与索引
(2)以上述最大值构造根节点
(3)以上述索引将数组分成左右两部分
(4)将当前节点的左节点、右节点通过递归赋值
更优解法
此部分转载于公众号代码随想录
还是可以通过索引的方式避免每次定义和创建新的数组造成的时空开销
递归三要素只不过将“返回值与参数”中的参数值改为:
当前访问的参数,左或右子树数组的前后数组索引
终止条件改为左右索引相等
对应Java代码
过程中因为没有考虑到元素值为0的情况,出现了无限递归,体现在num[I] >= maxValue的等号处
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
TreeNode root = null;
if(nums.length == 0) {return root;}
root = traversal(root, nums, 0, nums.length);
return root;
}
public TreeNode traversal(TreeNode cur, int[] nums, int startIndex, int endIndex){
if(startIndex == endIndex){return null;}
// 保持左闭右开原则
int maxValue = 0;
int maxIndex = 0;
for(int i = startIndex; i < endIndex; i++){
if(nums[i] >= maxValue){
maxValue = nums[i];
maxIndex = i;
}
}
cur = new TreeNode(maxValue);
int leftStartIndex = startIndex;
int leftEndIndex = maxIndex;
int rightStartIndex = maxIndex + 1;
int rightEndIndex = endIndex;
cur.left = traversal(cur.left, nums, leftStartIndex, leftEndIndex);
cur.right = traversal(cur.right, nums, rightStartIndex, rightEndIndex);
return cur;
}
}