「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」
最大二叉树
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
- 二叉树的根是数组中的最大元素。
- 左子树是通过数组中最大值左边部分构造出的最大二叉树。
- 右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。
输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
- 空数组,无子节点。
- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
- 空数组,无子节点。
- 只有一个元素,所以子节点是一个值为 1 的节点。
- [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
- 只有一个元素,所以子节点是一个值为 0 的节点。
- 空数组,无子节点。
- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
解法
我们可以通过递归来解决这道题
- 递归的操作:首先我们先获取当前数组的最大值索引,以此得到最大值来构建这层的根节点,并通过索引来将数组分割为左右两个数组,这两个数组分别对应了该根节点左右两个子树的val值集合,递归得到当前根节点的左子节点和右子节点
- 递归的返回值:返回当前层构建的根节点,供其父节点做left和right连接
- 递归的终止条件:当传入的构建数组长度为0时,证明已经递归结束
代码如下:
var constructMaximumBinaryTree = function(nums) {
const constructSubMaximumBinaryTree = function(nums) {
if(nums.length === 0) return null;
let maxIndex = nums.indexOf(Math.max(...nums));
let rootNode = new TreeNode(nums[maxIndex]);
let leftNums = nums.slice(0,maxIndex);
let rightNums = nums.slice(maxIndex + 1)
rootNode.left = constructSubMaximumBinaryTree(leftNums);
rootNode.right = constructSubMaximumBinaryTree(rightNums);
return rootNode;
}
if(nums.length === 0) return null;
let root = constructSubMaximumBinaryTree(nums);
return root;
};