当前位置: 首页 > news >正文

654. 最大二叉树

题目

leetcode题目地址

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

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

示列1

在这里插入图片描述

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

示列2

在这里插入图片描述

输入:nums = [3,2,1]
输出:[3,null,2,null,1]

提示:

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

code

递归:

  1. 确定函数的参数和返回值。参数是数组,返回值是节点。
  2. 确定递归终止条件。当没有元素时,返回null;当只有一个元素时,证明是叶子节点了,返回该节点。
  3. 找出每一次递归的逻辑
    找出最大值的下标,将最大值作为根节点,根据最大值下标划分区别。最大值下标左边,构造左子树;最大值下标右边,构造右子树。
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return constructMaximumBinaryTreeRec(nums,0,nums.length);}public TreeNode constructMaximumBinaryTreeRec(int[] nums,int leftIndex,int rightIndex){// 没有元素了if(rightIndex - leftIndex <1){return null;}// 只有一个元素了if(rightIndex-leftIndex == 1){return new TreeNode(nums[leftIndex]);}int maxIndex = leftIndex; // 最大值的索引位置int maxVal = nums[maxIndex]; // 最大值for(int i=leftIndex+1;i<rightIndex;i++){if(nums[i]>maxVal){maxVal = nums[i];maxIndex = i;}}// 划分左右子树TreeNode node = new TreeNode(maxVal);node.left = constructMaximumBinaryTreeRec(nums,leftIndex,maxIndex);node.right = constructMaximumBinaryTreeRec(nums,maxIndex+1,rightIndex);return node;}
}
http://www.lryc.cn/news/32098.html

相关文章:

  • 快速幂----快速求解底数的n次幂
  • 【FMCW 04】测角-Angle FFT
  • Linux操作系统学习(线程同步)
  • 了解动态规划算法:原理、实现和优化指南
  • 《NFL橄榄球》:明尼苏达维京人·橄榄1号位
  • sheng的学习笔记-Actuator健康监控
  • 初次使用ESP32-CAM记录
  • 华为OD机试真题Python实现【最长连续交替方波信号】真题+解题思路+代码(20222023)
  • 【操作系统原理实验】页面替换策略模拟实现
  • Java中解析XML文件
  • 二点回调测买 源码
  • 钉钉端H5开发调试怎么搞
  • Mysql Server原理简介
  • 23种设计模式-外观模式
  • 使用 Vulkan VkImage 作为 CUDA cuArray
  • 电商API接口-电商OMS不可或缺的一块 调用代码展示
  • Solaris ZFS文件系统rpool扩容
  • 模式识别 —— 第二章 参数估计
  • 判断4位回文数-课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)
  • 【NLP】Word2Vec 介绍
  • 3月6日,30秒知全网,精选7个热点
  • Python笔记 -- 字典
  • 【独家】华为OD机试 - 滑动窗口(C 语言解题)
  • MySQL调优 - SQL查询深度分页问题
  • 0306spring--复习
  • 动手实现一遍Transformer
  • 【Flutter入门到进阶】Flutter基础篇---弹窗Dialog
  • 【操作系统】进程和线程的区别
  • Linux开发环境配置--正点原子阿尔法开发板
  • Android ThreadPoolExecutor的基本使用