构造最大二叉树,大无语事件发生

LeetCode 第654题 最大二叉树 做题记录

题目描述

在这里插入图片描述

我的解法

思路

本题与通过后序与中序构造二叉树的题目有些相似,只不过把递归通过两种顺序查找节点的过程变成了寻找数组最大值,不过不同的是构造二叉树可以通过构造HashMap降低寻找节点的时间,最大值则不行。但是用一开始时间复杂度为O(n)的算法只要稍加修改把查找中序中符合条件的节点变成查找最大值节点即可。

递归三要素:

  1. 返回值与参数:返回值为构造的新节点,参数有当前访问的参数,左或右子树数组
  2. 终结条件:递归过程中当前数组为空时,返回null
  3. 单层递归逻辑:
    (1)获取当前数组中最大值的值与索引
    (2)以上述最大值构造根节点
    (3)以上述索引将数组分成左右两部分
    (4)将当前节点的左节点、右节点通过递归赋值

更优解法

此部分转载于公众号代码随想录

还是可以通过索引的方式避免每次定义和创建新的数组造成的时空开销
递归三要素只不过将“返回值与参数”中的参数值改为:
当前访问的参数,左或右子树数组的前后数组索引
终止条件改为左右索引相等

对应Java代码

过程中因为没有考虑到元素值为0的情况,出现了无限递归,体现在num[I] >= maxValue的等号处
在这里插入图片描述

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        TreeNode root = null;
        if(nums.length == 0) {return root;}
        root = traversal(root, nums, 0, nums.length);
        return root;
    }
    public TreeNode traversal(TreeNode cur, int[] nums, int startIndex, int endIndex){
        if(startIndex == endIndex){return null;}
        // 保持左闭右开原则
        int maxValue = 0;
        int maxIndex = 0;
        for(int i = startIndex; i < endIndex; i++){
            if(nums[i] >= maxValue){
                maxValue = nums[i];
                maxIndex = i;
            }
        }
        cur = new TreeNode(maxValue);
        int leftStartIndex = startIndex;
        int leftEndIndex = maxIndex;
        int rightStartIndex = maxIndex + 1;
        int rightEndIndex = endIndex;
        cur.left = traversal(cur.left, nums, leftStartIndex, leftEndIndex);
        cur.right = traversal(cur.right, nums, rightStartIndex, rightEndIndex);
        return cur; 
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值