给你一个数组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;
}