SOURCE

// 思路
// 用递归 每层递归传入的数组 找出其 最大值 和 对应索引
// 用这个点将数组分割成左右子树 再传入递归 依次构建出最大二叉树
// 优化版 是将递归传入数组 改为 分割点 在原数组上操作 可以节省时间和内存开销

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 命令行工具 X clear

                    
>
console