代码随想录-58-654.最大二叉树

目录

  • 前言
    • 题目
    • 1.构造二叉树-递归(区间,左闭右开)
    • 2. 本题思路分析:
    • 3. 算法实现
    • 4. 算法复杂度
    • 5. 算法坑点

前言

在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。
代码随想录此题链接

题目

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

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

代码随想录-58-654.最大二叉树_第1张图片
代码随想录-58-654.最大二叉树_第2张图片
代码随想录-58-654.最大二叉树_第3张图片
代码随想录-58-654.最大二叉树_第4张图片

1.构造二叉树-递归(区间,左闭右开)

在递归构造二叉树时,在每次递归的时候不用重复切割数组,递归的时候用数组左右下标表示当前数组的范围(用来替代赋值一个新的二叉树)

2. 本题思路分析:

此题可以使用递归遍历,
三部曲:

  • 第一步确定参数和返回值
    参数:数组,以及表示当前数组范围的左右两个int类型值(begin,end),作为数组的左右范围(这里是左闭右开)
    返回值:根节点
  • 第二步截止递归的条件
    递归允许空节点进入,所以这里要判断空节点进入后的返回逻辑;
    如果是空节点进入,那么也就是end>=begin时,返回null;
    在这里也可以处理叶子结点的特殊情况,当end = begin + 1时,为叶子结点,直接用当前的值构造一个TreeNode类型对象返回。
  • 第三步单层递归逻辑
    找到当前数组中最大的值,下标为maxIndex,用其值创建一个新的TreeNode,递归左右孩子,左孩子的数组范围为:begin,maxIndex;右孩子的范围:maxIndex+1,end。

3. 算法实现

public TreeNode constructMaximumBinaryTree(int[] nums) {
    return  travalBinaryTree(nums,0,nums.length);
}
//左闭右开
public TreeNode travalBinaryTree(int[] nums,int begin,int end) {
    if(begin + 1 == end){
        TreeNode cur = new TreeNode(nums[begin]);
        return cur;
    }else if(begin >= end){
        return null;
    }
    int maxIndex = findMaxIndex(nums,begin,end);
    TreeNode tree = new TreeNode(nums[maxIndex]);
    tree.left = travalBinaryTree(nums,begin,maxIndex);
    tree.right = travalBinaryTree(nums,maxIndex + 1,end);
    return tree;
}

public int findMaxIndex(int[] nums,int begin,int end){
    int maxVal = nums[begin];
    int maxIndex = begin;
    for(int i = begin;i < end;i++){
        if(nums[i] > maxVal){
            maxVal = nums[i];
            maxIndex = i;
        }
    }
    return maxIndex;
}

4. 算法复杂度

暂无

5. 算法坑点

暂无

你可能感兴趣的:(算法,数据结构,leetcode)