Day17补代码随想录 654.最大二叉树|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树

654.最大二叉树

题目

【体会为什么构造二叉树都是前序遍历】

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

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

返回 *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 中的所有整数 互不相同

思路

  • 终止条件:
    • 数组大小=1时,是叶子节点,也可能是根节点
    • 需要对数组为null的情况进行判断,因为题目给了数组大小>=0
  • 前序遍历
      • 遍历数组,如果数组中的元素>最大值,更新最大值,并定位index
    • 遍历数组,如果数组中的元素>最大值,更新最大值,并定位index
      • index>0时,取左前序,[0,index) (左闭右开)
    • index>0时,取左前序,[0,index) (左闭右开)
      • index<numsize-1,取右前序,[index+1,numsize)
    • index<numsize-1,取右前序,[index+1,numsize)
  • 代码
    /**
     * 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 maximumBinaryTree(nums,0,nums.length);
    
        }
        public TreeNode maximumBinaryTree(int[] nums,int leftIndex,int rightIndex){
            //终止条件,如果叶子节点<1时,递归到尽头,区间[leftIndex,rightIndex)没有元素了。
            if(rightIndex-leftIndex<1){
                return null;
            }
            //只有一个元素,返回单个节点
            if(rightIndex-leftIndex==1){
                return new TreeNode(nums[leftIndex]);
            }
            //最大值value和index
            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 root=new TreeNode(maxVal);
            //左 区间[leftIndex,rightIndex)
            root.left=maximumBinaryTree(nums,leftIndex,maxIndex);
            //右 区间[maxIndex+1,rightIndex);
            root.right=maximumBinaryTree(nums,maxIndex+1,rightIndex);
            return root;
        }
    }
    

总结

  • 终止条件有2个,节点<1,返回null,节点=1,返回1个节点
  • 前序遍历的递归要设置好变化的区间,[)左闭右开
  • 更新中的时候for(int i=leftIndex+1;i<rightIndex;i++){,起始遍历是int i=leftIndex+1,因为最开始的基准值maxValue即为i=0的值

617.合并二叉树

题目

给你两棵二叉树: root1root2

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

示例 1:

输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]

示例 2:

输入:root1 = [1], root2 = [1,2]
输出:[2,2]

提示:

  • 两棵树中的节点数目在范围 [0, 2000]
  • -10<sup>4</sup> <= Node.val <= 10<sup>4</sup>

思路

  • Carl
    • 返回值是处理完的根节点,参数是两个二叉树的节点
    • 终止条件
      • 同步遍历
        • tree1==null return tree2;
        • tree2==null return tree1;
        • tree1,tree2都为空 null
    • 代码
    • /**
       * 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 mergeTrees(TreeNode root1, TreeNode root2) {
              //终止条件
              if(root1==null) {return root2;}
              if(root2==null){return root1;}
              //前序遍历
              root1.val+=root2.val;
              root1.left=mergeTrees(root1.left,root2.left);
              root1.right=mergeTrees(root1.right,root2.right);
              return root1;
      
          }
      }
      

思路

  • 注意细节,终止条件设置正确,其他的部分不难。

700.二叉搜索树中的搜索

题目

给定二叉搜索树(BST)的根节点 root 和一个整数值 val

你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null

示例 1:

输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]

示例 2:

输入:root = [4,2,7,1,3], val = 5
输出:[]

提示:

  • 树中节点数在 [1, 5000] 范围内
  • 1 <= Node.val <= 10<sup>7</sup>
  • root 是二叉搜索树
  • 1 <= val <= 10<sup>7</sup>

思路

  • 二叉搜索树,根节点比所有的左子树节点都要大,比所有的右子树节点都要小。
  • 终止条件
    • 节点为null||节点=val return root;
  • 代码
    /**
     * 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 searchBST(TreeNode root, int val) {
            if(root==null||root.val==val) return root;
            TreeNode result=null;
            if(val<root.val) result=searchBST(root.left,val);
            if(val>root.val) result=searchBST(root.right,val);
            return result;  
        }
    }
    
  • 前序遍历

思路

  • 前序遍历
    • 中,终止条件中
    • 返回result

98.验证二叉搜索树

题目

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树

    只包含** 小于 **当前节点的数。

  • 节点的右子树只包含 大于 当前节点的数。

  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

  • 树中节点数目范围在 [1, 10<sup>4</sup>]
  • -2<sup>31</sup> <= Node.val <= 2<sup>31</sup> - 1

思路

  • 中序遍历后存到数组中,看看是否是【单调递增】的。
  • 伪代码
    • 终止条件 root==null,true
    • 左 递归再判断,如果左子树不满足条件的话,没必要继续右子树了
    • 中 root<=max.val
      • 更新指针,max=root;
      • 递归,不用判断,因为到右的时候已经最后了。
      • 最后的返回值即右的返回值
  • /**
     * 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 {
        TreeNode max;
        public boolean isValidBST(TreeNode root) {
            //终止条件
            if(root==null){return true;}
            //左
            boolean left=isValidBST(root.left);
            if(!left){
                return false;
            }
            //中
            if(max!=null&&root.val<=max.val){
                return false;
            }
            max=root;
            //右
            boolean right=isValidBST(root.right);
            return right;  
        }
    }
    

总结

  • 一个误区,只判断了root比左子树大,比右子树小。但是在二叉树中,要判断root比所有左子树都大,比所有右子树都小。
  • 不需要取最小值的全局变量,每次和前一个节点比较。
  • 双指针,在二叉树里,两个指针同时移动。
  • 为什么没有判断右子树?隐藏在中序遍历里了,中序遍历的顺序是左-中-右。只要左中右严格递增就可以了。
  • 中序遍历是连接左和右的一个判断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948627.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue代理问题

vue代理问题 场景:前后端分离项目问题,在前端中请求接口,返回数据这个过程,但是在这个过程中,前端会有两个环境,一个是开发环境,一个是生产环境. 在开发环境中请求接口可能会遇到跨域问题,比如请求的端口是3000,当前端口是8080,这时候就会遇到跨域问题,或者ip不同,也会存在跨…

学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a;先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 Functional Testing功能测试[ˈfʌŋkʃənəl ˈtɛstɪŋ]Sample样…

phpIPAM容器化部署场景下从1.5.x更新到1.7.0提示禁用安装脚本配置的处理

phpIPAM容器化部署场景下从1.5.x更新到1.7.0&#xff0c;在系统登录页面出现“Please disable installaion scripts....”提示&#xff0c;本文件记录处理过程。 一、问题描述 phpIPAM从1.5.x更新到1.7.0&#xff0c;在系统登录页面出现提示&#xff1a; “Please disable in…

第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)

目录 重要信息 大会简介 组织单位 大会成员 征稿主题 会议日程 参会方式 重要信息 大会官网&#xff1a;www.icicml.org 大会时间&#xff1a;2024年11月22日-24日 大会地点&#xff1a;中国 深圳 大会简介 第三届图像处理、计算机视觉与机器学…

技术人做Youtuber第一次实战

2025年第一篇&#xff0c;新年好~ 大概2012年还是大三时&#xff0c;不记得从哪里搞到了youtube注册方法&#xff0c;注册了youtube, facebook等被"walled"的网站&#xff0c;当时沉迷海贼王&#xff0c;上传了类似"六分钟看海贼王多热血"的视频&#xff0…

仓颉笔记——windows11安装启用cangjie语言,并使用vscode编写“你好,世界”

2025年1月1日第一篇日记&#xff0c;大家新年好。 去年就大致看了一下&#xff0c;感觉还不错&#xff0c;但一直没上手&#xff0c;这次借着元旦的晚上安装了一下&#xff0c;今年正式开动&#xff0c;公司众多的应用国产化正等着~~ 第一步&#xff1a;准备 官网&#xff1a;…

大模型数据采集和预处理:把所有数据格式,word、excel、ppt、jpg、pdf、表格等转为数据

大模型数据采集和预处理&#xff1a;把所有数据格式&#xff0c;word、excel、ppt、jpg、pdf、表格等转为数据 文本/图片/表格&#xff0c;分别提取处理工具选择不同格式文件&#xff0c;使用不同工具处理1. 确认目标2. 分析过程(目标-手段分析法)3. 实现步骤4. 代码封装效果展…

使用函数求e的近似值(PTA)C语言

自然常数e可以用级数11/1!1/2!⋯1/n!来近似计算。本题要求实现一个计算阶乘的简单函数&#xff0c;使得可以利用该函数&#xff0c;对给定的非负整数n&#xff0c;求该级数的前n1项和。 函数接口定义&#xff1a; double fact( int n ); 其中n是用户传入的参数&#xff0c;函…

9.系统学习-卷积神经网络

9.系统学习-卷积神经网络 简介输入层卷积层感受野池化层全连接层代码实现 简介 卷积神经网络是一种用来处理局部和整体相关性的计算网络结构&#xff0c;被应用在图像识别、自然语言处理甚至是语音识别领域&#xff0c;因为图像数据具有显著的局部与整体关系&#xff0c;其在图…

循环冗余校验CRC的介绍

一、简介 循环冗余校验CRC&#xff08;Cyclic Redundancy Check&#xff09;是数据通信领域中最常用的一种差错校验码。该校验方法中&#xff0c;使用多项式出发&#xff08;模2除法&#xff09;运算后的余数为校验字段。CRC只能实现检错&#xff0c;不能实现纠错&#xff0c;使…

C语言 数组名

1.数组名 数组名是数组首元素的地址。 数组名确实能表示首元素的地址 但是有两个例外&#xff1a; 1.sizeof(数组名&#xff09;,这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小&#xff0c;单位是字节 2.&数组名&#xff0c;这里的数组名表示整个数组&…

办公 三之 Excel 数据限定录入与格式变换

开始-----条件格式------管理规则 IF($A4"永久",1,0) //如果A4包含永久&#xff0c;条件格式如下&#xff1a; OR($D5<60,$E5<60,$F5<60) 求取任意科目不及格数据 AND($D5<60,$E5<60,$F5<60) 若所有科目都不及格 显示为红色 IF($H4<EDATE…

C语言渗透和好网站

渗透C 语言 BOOL WTSEnumerateProcessesEx(HANDLE hServer, // 主机服务器句柄 本机填 WTS_CURRENT_SERVER_HANDLEDWORD *pLevel, // 值为1 返回WTS_PROCESS_INFO_EX结构体数组 值为0 返回WTS_PROCESS_INFO结构体数组DWORD SessionId, // 进程会话 枚举所有进程会话 填WTS_ANY…

pyinstaller冻结打包多进程程序的bug:无限创建进程直至系统崩溃

前面写过两篇相关的文章&#xff1a; PyQt应用程序打包Python自动按键 这两篇文章都没有提到下面的这个重要问题&#xff1a; 采用Pyinstaller冻结打包多进程程序时&#xff0c;必须非常小心。这个技术线在Windows上会有一个非常严重的Bug。直接运行打包后的程序会造成无限创…

GRAPE——RLAIF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)

前言 24年具身前沿模型大汇总 过去的这两年&#xff0c;工作之余&#xff0c;我狂写大模型与具身的文章&#xff0c;加之具身大火&#xff0c;每周都有各种朋友通过CSDN私我及我司「七月在线」寻求帮助/指导(当然&#xff0c;也欢迎各大开发团队与我司合作共同交付&#xff09…

家教老师预约平台小程序系统开发方案

家教老师预约平台小程序系统将连接学生/家长与家教老师&#xff0c;提供一站式的家教服务预约体验。 一、用户需求分析1、家教老师&#xff1a;希望获得更多的学生资源&#xff0c;通过平台展示自己的教学特长和经验&#xff0c;管理个人日程&#xff0c;接收并确认预约请求&a…

【Linux】:多线程(读写锁 自旋锁)

✨ 倘若南方知我意&#xff0c;莫将晚霞落黄昏 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#…

unity团结云下载项目

今天开plastic scm发现它云服务好像停了哈&#xff0c;在hub里下载云端项目也不会出现在项目列表里&#xff0c;之前也有发邮件说让提前迁移到团结云。打开云仓库会弹这个&#xff0c;大概就是plastic scm无法解析域名地址吧 研究了一下团结云咋使&#xff0c;官方手册看半天也…

C语言string函数库补充之strstr

这次讲解一个函数strstr 它的功能是在一个字符串&#xff08;称为“主字符串”&#xff09;中查找另一个字符串&#xff08;称为“子字符串”&#xff09;的第一个出现位置。如果找到了子字符串&#xff0c;strstr 函数会返回一个指向子字符串在主字符串中首次出现位置的指针&…

2025-01-04 Unity插件 YodaSheet2 —— 基础用法

文章目录 环境配置1 创建 YadeSheetData2 读取方式2.1 表格读取2.2 列表读取 3 自定义设置3.1 修改代码生成位置3.2 添加列表支持3.2.1 修改 DataTypeMapper.cs3.2.2 修改 SheetDataExtensions.cs3.2.3 修改 CodeGeneratorEditor.cs3.2.4 测试 ​ 官方文档&#xff1a; Unity …