最大二叉树

57 阅读1分钟

题目描述

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大二叉树 。

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000
  • nums 中的所有整数 互不相同

示例

image.png

输入: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 的节点。
        *   空数组,无子节点。

思路

  1. 构造二叉树的题目都是按照前序遍历的思路来做的
  2. 采用递归的思路,传入值: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;
    ```
};

image.png

总结

  1. 要读懂题意
  2. 构建二叉树一般采用前序遍历,只有中节点构建好了,才能构建左子节点和右子节点
  3. 用递归做时,要弄清楚传参和返回值以及终止条件。 如有错误之处,欢饮大家留言指出,谢谢大家了。