代码随想录刷题day17丨654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树

news2024/11/15 13:38:09

代码随想录刷题day17丨654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树

1.题目

1.1最大二叉树

  • 题目链接:654. 最大二叉树 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html

  • 解题思路:递归(前序遍历)

    • 构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。
    • 确定递归函数的参数和返回值
      • 参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。
    • 确定终止条件
      • 题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。
      • 那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。 这表示一个数组大小是1的时候,构造了一个新的节点,并返回。
    • 确定单层递归的逻辑
      • 先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组。
      • 最大值所在的下标左区间 构造左子树(这里要判断maxValueIndex > 0,因为要保证左区间至少有一个数值。)
      • 最大值所在的下标右区间 构造右子树(判断maxValueIndex < (nums.size() - 1),确保右区间至少有一个数值。)
  • 代码:

    /**
     * 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) {
            if(nums.length == 1){
                return new TreeNode(nums[0]);
            }
    
            int maxValue = 0;
            int maxValueIndex = 0;
            for(int i =0;i < nums.length;i++){
                if(nums[i] > maxValue){
                    maxValue = nums[i];
                    maxValueIndex = i;
                } 
            }
            TreeNode node = new TreeNode(maxValue);
    
            if(maxValueIndex > 0){
                int[] arrLeft = new int[maxValueIndex];
                for(int i = 0;i < maxValueIndex;i++){
                    arrLeft[i] = nums[i];
                } 
                node.left = constructMaximumBinaryTree(arrLeft);
            }
    
            if(maxValueIndex < nums.length -1){
                int[] arrRight = new int[nums.length - maxValueIndex - 1];
                for(int i = maxValueIndex + 1;i < nums.length;i++){
                    arrRight[i -maxValueIndex - 1] = nums[i];
                }
                node.right = constructMaximumBinaryTree(arrRight);
            }
            return node;
        }
    }
    
  • 总结:

    • 构造二叉树都是 前序遍历

1.2合并二叉树

  • 题目链接:617. 合并二叉树 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:一起操作两个二叉树?有点懵!| LeetCode:617.合并二叉树_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0617.%E5%90%88%E5%B9%B6%E4%BA%8C%E5%8F%89%E6%A0%91.html

  • 解题思路:递归(前序遍历)

    • 其实和遍历一个树逻辑是一样的,只不过传入两个树的节点,同时操作。
    • 确定递归函数的参数和返回值:
      • 首先要合入两个二叉树,那么参数至少是要传入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。
    • 确定终止条件:
      • 因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。
      • 反过来如果t2 == NULL,那么两个数合并就是t1(如果t1也为NULL也无所谓,合并之后就是NULL)。
    • 确定单层递归的逻辑:
      • 单层递归的逻辑就比较好写了,这里我们重复利用一下t1这个树,t1就是合并之后树的根节点(就是修改了原来树的结构)。
  • 代码:

    /**
     * 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;
        }
    }
    
  • 总结:

    • 优先掌握递归
    • 本题递归用中序和后序也都可以,换个顺序就行,前序更方便直观理解

1.3二叉搜索树中的搜索

  • 题目链接:700. 二叉搜索树中的搜索 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:不愧是搜索树,这次搜索有方向了!| LeetCode:700.二叉搜索树中的搜索_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0700.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%90%9C%E7%B4%A2.html

  • 解题思路:递归法或者迭代法

    • 确定递归函数的参数和返回值
      • 递归函数的参数传入的就是根节点和要搜索的数值,返回的就是以这个搜索数值所在的节点。
    • 确定终止条件
      • 如果root为空,或者找到这个数值了,就返回root节点。
    • 确定单层递归的逻辑
      • 因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。
      • 如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回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 searchBST(TreeNode root, int val) {
            if(root == null || root.val == val){
                return root;
            }
            TreeNode resNote = null;
            if(val < root.val){
                resNote = searchBST(root.left,val);
            }
            if(val > root.val){
                resNote = searchBST(root.right,val);
            }
            return resNote;
        }
    }
    
    class Solution {
        // 迭代,普通二叉树
        public TreeNode searchBST(TreeNode root, int val) {
            if (root == null || root.val == val) {
                return root;
            }
            Stack<TreeNode> stack = new Stack<>();
            stack.push(root);
            while (!stack.isEmpty()) {
                TreeNode pop = stack.pop();
                if (pop.val == val) {
                    return pop;
                }
                if (pop.right != null) {
                    stack.push(pop.right);
                }
                if (pop.left != null) {
                    stack.push(pop.left);
                }
            }
            return null;
        }
    }
    
    
    class Solution {
        // 迭代,利用二叉搜索树特点,优化,可以不需要栈
        public TreeNode searchBST(TreeNode root, int val) {
            while (root != null)
                if (val < root.val) root = root.left;
                else if (val > root.val) root = root.right;
                else return root;
            return null;
        }
    }
    
  • 总结:

    • 递归和迭代 都可以掌握一下,因为本题比较简单

1.4验证二叉搜索树

  • 题目链接:98. 验证二叉搜索树 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0098.%E9%AA%8C%E8%AF%81%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html

  • 解题思路:递归(中序遍历)

    • 中序遍历看是否单调递增
    • 要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。
    • 用双指针思想优化递归过程做该题效果最好
  • 代码:

    /**
     * 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 pre = null; // 类的成员变量,用来保存中序遍历过程中前一个节点
        public boolean isValidBST(TreeNode root) {
            if(root == null){
                return true;// 空树是有效的二叉搜索树
            }
            boolean left = isValidBST(root.left);
            if(pre != null && pre.val >= root.val){
                return false;
            }
            pre = root;// 更新 pre 为当前节点
            boolean right = isValidBST(root.right);
            return left && right;// 返回左子树和右子树是否都是有效的 BST
        }
    }
    
  • 总结:

    • 遇到 搜索树,一定想着中序遍历,这样才能利用上特性。
    • 但本题是有陷阱的
      • 不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了
      • 我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GeoscenePro】Pro连接本机Portal

打开自己的portal下面框住的就是链接的地址 证书的话点击是即可

嵌入式数据库

概述 1.作用&#xff1a;存储大量数据&#xff0c;专业存储数据 存储在内存&#xff08;数组&#xff0c;变量&#xff0c;链表&#xff09;上的特点&#xff1a;程序运行结束&#xff0c;或者掉电&#xff0c;数据会丢失。 存储在硬盘&#xff08;文件&#xff09;上的特点…

恺英网络:有业绩,无“游戏”

2024年上半年&#xff0c;恺英网络的业绩依然很好&#xff0c;但有些不讲逻辑了。 8月22日晚&#xff0c;恺英网络发布了2024年半年度财报。 报告显示&#xff0c;上半年公司实现营业收入25.55亿元&#xff0c;同比增长29.28%&#xff1b;归母净利润和扣非净利润分别为8.09亿…

鸿蒙开发5.0【基于Search组件实现搜索栏】

场景一&#xff1a;自定义搜索图标 方案 基于Search组件的searchIcon属性设置搜索图标&#xff0c;searchIcon可以设置size、color。注意&#xff1a;当前搜索图标不支持隐藏且不支持位置调整。基于searchButton属性设置搜索框末尾搜索按钮。基于该属性可更改文本内容及文本样…

Pepper佩盼尔wordpress模板

Pepper佩盼尔WordPress模板是一款专为追求简洁、现代和专业外观的网站设计者和开发者打造的高品质主题。它以简站为主题&#xff0c;强调“让建网站更简单”的理念&#xff0c;旨在为用户提供一个易于使用、功能丰富的平台来构建他们的在线业务或个人网站。 模板特点包括&…

【JavaEE】网络原理 UDP协议

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f383;一.运输层 运输层&#xff08;Transport Layer&#xff09;是OSI七层模型中的第四层&#xff0c;也是TCP/IP四层模型中的第三层。它的主要职责是…

在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-全身CT器官分割

在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-全身CT器官分割 文章持续更新&#xff0c;可以关注微公【医学图像人工智能实战营】获取最新动态。人手有限&#xff0c;文中涉及的链接前往微公对应文章查看。关注Tina姐&#xff0c;一起学习进步~ 导读 本系列…

云计算基础之Docker

云计算是什么 云计算的本质是计算资源的虚拟化。 与磁盘逻辑卷的分配类似&#xff0c;云计算是在负载波动时动态调整服务器计算资源&#xff0c;避免资源浪费的做法&#xff0c;生产环境中&#xff0c;厂商一般将服务器组成一个池&#xff0c;实现逻辑管理计算资源&#xff0…

实时图像编辑大革新!Adobe发布TurboEdit:可以通过文本来编辑图像,编辑时间<0.5秒!

今天给大家介绍Adobe研究院新的研究TurboEdit&#xff0c;可以通过文本来编辑图像&#xff0c;通过一句话就能改变图像中的头发颜色、衣服、帽子、围巾等等。而且编辑飞快&#xff0c;<0.5秒。简直是图像编辑的利器。 相关链接 项目&#xff1a;betterze.github.io/TurboE…

闪存刷新机制文献的解读

闪存刷新机制文献的解读 一、文献信息1、标题&#xff1a;Flash Correct-and-Refresh: Retention-Aware Error Management for Increased Flash Memory Lifetime2、作者来源&#xff1a;卡耐基梅隆大学 二、Motivation三、Technique ( Flash Correct-and-Refresh, FCR )1、Repr…

如何使用Svg矢量图封装引用到vue3项目中

前言 在现代前端开发中&#xff0c;SVG&#xff08;可缩放矢量图形&#xff09;因其高质量和灵活性成为了图标和图形设计的热门选择。对于 Vue 3 项目而言&#xff0c;将 SVG 图标封装和引用到项目中不仅能提升性能&#xff0c;还能带来更高的可维护性和一致性。SVG 图标本质上…

LED的使用寿命评估

一&#xff0e;前言 LED光源随着时间的推移&#xff0c;输出光功率会逐渐衰减。在某一时间点&#xff0c;当LED发出的光衰减到一定水平&#xff0c;就无法满足应用要求。因此&#xff0c;常遇见客户会索取产品中LED光源的使用寿命数据。那么怎样确认LED的使用寿命呢&#xff1…

视觉Mamba综述——Visual Mamba: A Survey and New Outlooks论文总结

Visual Mamba: A Survey and New Outlooks &#xff08;31页&#xff0c;视觉Mamba综述&#xff09; 香港科技大学计算机科学与工程系 https://github.com/Ruixxxx/Awesome-Vision-Mamba-Models. 任务背景 0.摘要 Mamba是最近提出的一种选择性结构化状态空间模型&#xff…

公共DNS大测评,哪个解析性能最好?

日前阿里云方面发布公告称&#xff0c;由于产品升级&#xff0c;将于2024年9月30日24时起对公共DNS中免费的解析请求采取智能流量管控措施。据其透露&#xff0c;“公共DNS仍会致力于为广大免费用户提供高质量的基础递归解析服务&#xff0c;但在高并发解析场景&#xff0c;将对…

建模杂谈系列249 增量数据的正态分布拟合

说明 从分布开始&#xff0c;分布又要从正态开始 假设有一批数据&#xff0c;只有通过在线的方式增量获得。 内容 1 生成 先通过numpy生成一堆随机数据&#xff0c;从3个正态分布生成&#xff0c;然后拼接起来。 import numpy as np import matplotlib.pyplot as plt from …

【智能算法改进】路径规划问题的多策略改进樽海鞘群算法研究

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】樽海鞘群算法&#xff08;SSA)原理及实现 2.改进点 无标度网络策略 复杂网络在图论中可以用边和节点表示&#xff0c; Barabasi 等于1999年通过分析大量的数据提出了无标度网络模型. 该网络…

框架 +【Mybatis】概述 以及 基础环境搭建

目录 什么是框架&#xff1f; java后端框架包括 Mybatis概述 1、背景介绍 2、mybatis介绍 Mybatis环境搭建 1.创建一个maven项目 2.导入mysql数据库驱动包 导入mybatis依赖的jar包 3.创建一个全局的mybatis配置文件 4.创建数据库,创建表,准备数据 5.创建一个访问接口…

单图生成 2D 和 3D 人物,高质量图像处理模型 CharacterGen来啦!

CharacterGen引入了一个简化的生成流程和一个图像条件的多视图扩散模型。该模型有效地将输入姿态校准到规范形式&#xff0c;同时保留输入图像的关键属性&#xff0c;从而解决了多样化姿态带来的挑战。 CharacterGen的另一个核心组成部分是基于Transformer的、可泛化的稀疏视图…

httpx:一个神奇的 Python HTTP客户端

文章目录 httpx&#xff1a;一个神奇的 Python HTTP客户端1. 背景&#xff1a;为什么选择 httpx&#xff1f;2. httpx 是什么&#xff1f;3. 如何安装 httpx&#xff1f;4. 简单的库函数使用方法5. 场景应用6. 常见问题及解决方案7. 总结 httpx&#xff1a;一个神奇的 Python H…

第 8 章 数据的家——MySQL的数据目录

8.1 数据库和文件系统的关系 数据库把表存储在文件系统上。当我们读取数据时&#xff0c;存储引擎会从文件系统中把数据读出来返回给我们&#xff1b;当我们写入数据时&#xff0c;存储引擎会把这些数据写回文件系统。 8.2 MySQL数据目录 8.2.1 数据目录和安装目录的区别 数…