题目描述
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大二叉树 。
1 <= nums.length <= 10000 <= nums[i] <= 1000nums中的所有整数 互不相同
示例
输入: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 的节点。
* 空数组,无子节点。
思路
- 构造二叉树的题目都是按照
前序遍历的思路来做的 - 采用递归的思路,传入值:nums数组,返回值:root,终止条件:nums.length==1(因为题目要求nums不为空)
代码
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function constructMaximumBinaryTree(nums: number[]): TreeNode | null {
if(nums.length==1){
return new TreeNode(nums[0]);
}
// 中
// 获取nums中最大值
let maxNum=0,maxIndex=0
for(let i=0;i<nums.length;i++){
if(nums[i]>maxNum){
maxNum=nums[i];
maxIndex=i;
}
}
let root=new TreeNode(maxNum);
//左
if(nums.slice(0,maxIndex).length>0){
root.left=constructMaximumBinaryTree(nums.slice(0,maxIndex));
}
//右
if(nums.slice(maxIndex+1,nums.length).length>0){
root.right=constructMaximumBinaryTree(nums.slice(maxIndex+1,nums.length));
}
return root;
```
};
总结
- 要读懂题意
- 构建二叉树一般采用
前序遍历,只有中节点构建好了,才能构建左子节点和右子节点 - 用递归做时,要弄清楚传参和返回值以及终止条件。 如有错误之处,欢饮大家留言指出,谢谢大家了。