// 思路
// 用递归 每层递归传入的数组 找出其 最大值 和 对应索引
// 用这个点将数组分割成左右子树 再传入递归 依次构建出最大二叉树
// 优化版 是将递归传入数组 改为 分割点 在原数组上操作 可以节省时间和内存开销
function fn(nums, 起始位置, 结束位置) {
// 遍历找出 起始 到 结束 范围内 最大值
let 中节点 = null
let 最大值索引 = -1
// 注意 起始位置 可以等于 结束位置 说明是叶子节点
for (let i = 起始位置; i <= 结束位置; i++) {
if (!中节点 || nums[i] > 中节点) {
// 没有值 或 找到更大的值 则更新记录
中节点 = nums[i]
最大值索引 = i
}
}
let node = {
value: 中节点
}
// 以下两个判断条件为递归出口 不满足条件就不会继续递归
if (最大值索引 > 起始位置) {
// 最大值索引大于起始位置 才能切割出左子树
// 注意 左闭右开 取最大值位置左边前一位 为结束位置
node.left = fn(nums, 起始位置, 最大值索引 - 1)
}
if (最大值索引 < 结束位置) {
// 最大值索引 小于 切割结束位置 才能切割出右子树
node.right = fn(nums, 最大值索引 + 1, 结束位置)
}
return node
}
// 验证
let nums = [3, 2, 1, 6, 0, 5]
console.log('最大二叉树', fn(nums, 0, nums.length - 1))
console