这道题显然也是构造二叉树的题目 一般构造二叉树的题目都是按照前序遍历来算的 因为前序遍历(中左右) 要先构造出根节点才能继续根据根节点往下构造其左右子树。
var constructMaximumBinaryTree = function(nums) {
// 创建一个函数 用来生成二叉树(包括左右子树) 传递的参数为arr数组(可以是子数组 或者最大的数组) left right 分别表示 数组的左右下标
let createTree = (arr,left,right)=>{
// 判断终止条件
if(left > right)return null;
let maxVal = -1; // 假设数组中最大的值是-1
let maxIndex = -1; // 假设数组中最大值的下标为-1
for(let i = left;i <= right; i++){
// 循环遍历数组 找出其中最大的值
if(arr[i] > maxVal){
maxVal = arr[i];
maxIndex = i;
}
}
// 构造出一棵树 这棵树的根节点为数组中最大值 即maxVal
let root = new TreeNode(maxVal); //中
// 递归的单层逻辑
root.left = createTree(arr,left,maxIndex-1) // 二叉树子树的左右区间的范围 我这里是左闭右闭
root.right = createTree(arr,maxIndex + 1,right);
return root;
}
// 将需要构造的数组传进createTree中 先找出根节点
let root = createTree(nums,0,nums.length-1);
return root
};