算法挑战23: 最大二叉树

2 阅读1分钟

给你一个数组nums,让你递归构建一个二叉树,要求以当前数组的最大值为当前的根节点


我的思路就是,找到数组最大值,构造当前根节点,分成左右两个数组, 递归两个数组


var constructMaximumBinaryTree = function(nums) {
    if (nums.length === 0) return null;

    // 找到数组中的最大值
    var maxVal = Math.max(...nums);
    var index = nums.indexOf(maxVal);

    var root = new TreeNode(maxVal);
    // 递归调用构造左右子树
    root.left = constructMaximumBinaryTree(nums.slice(0, index));
    root.right = constructMaximumBinaryTree(nums.slice(index + 1, nums.length));
    
    return root;
}

这个是用slice()分割的数组,返回一个子数组

其实可以在原数组上进行操作,不过需要多传两个参数, 数组最小索引和最大索引

var constructMaximumBinaryTree = function(nums) {
    return build(nums, 0, nums.length - 1);
}

// 定义:将 nums[lo..hi] 构造成符合条件的树,返回根节点
function build(nums, lo, hi) {
    // base case
    if (lo > hi) {
        return null;
    }

    // 找到数组中的最大值和对应的索引
    let index = -1, maxVal = Number.MIN_SAFE_INTEGER;
    for (let i = lo; i <= hi; i++) {
        if (maxVal < nums[i]) {
            index = i;
            maxVal = nums[i];
        }
    }

    // 先构造出根节点
    let root = new TreeNode(maxVal);
    // 递归调用构造左右子树
    root.left = build(nums, lo, index - 1);
    root.right = build(nums, index + 1, hi);
    
    return root;
}