【二叉树】力扣OJ题

文章目录

  • 前言
  • 1. 翻转二叉树
    • 1.1 题目
    • 1.2 解题思路
    • 1.3 代码实现
    • 1.4 时空复杂度
  • 2. 对称二叉树
    • 2.1 题目
    • 2.2 解题思路
    • 2.3 代码实现
    • 2.4 时空复杂度
  • 3. 平衡二叉树
    • 3.1 题目
    • 3.2 解题思路
    • 3.3 代码实现
    • 3.4 时空复杂度
  • 结语


前言

本篇博客主要介绍二叉树的经典 OJ 题,题目主要来源于力扣和牛客网,熟练掌握这些题型将会使你对二叉树的理解更上一层楼


1. 翻转二叉树

原题地址:力扣 226.翻转二叉树

1.1 题目

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点

在这里插入图片描述

1.2 解题思路

看到是二叉树,我们就要考虑能不能使用递归法(大部分情况下是可以的)。在本题中,题目要求我们翻转二叉树,意思也就是以根节点为基准,交换左右子树(示例2),而且子树也同理(示例1),我们需要递归的交换左右子树,达到翻转二叉树的效果,最后返回根节点

根据思路我们可以总结出递归的两个条件:

  1. 终止条件

    当前节点为 null 就返回

  2. 单层递归的逻辑

    交换当前节点的左右节点,再递归的交换当前节点的左节点,递归的交换当前节点的右节点

1.3 代码实现

class Solution {
    public TreeNode invertTree(TreeNode root) {
        //终止条件
        if(root == null) {
            return null;
        }
        //暂时存储左节点,让左右节点交换
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
        //交换结束,递归左节点
        invertTree(root.left);
        //递归右节点
        invertTree(root.right);
        //最后返回根节点
        return root;
    }
}

1.4 时空复杂度

时间复杂度为 O(N),每个节点都会遍历到

空间复杂度为 O(N),最坏情况下树形成链状


2. 对称二叉树

原题链接:力扣 101.对称二叉树

2.1 题目

给你一个二叉树的根节点 root , 检查它是否轴对称

在这里插入图片描述

2.2 解题思路

题目要求我们判断一棵二叉树是否轴对称,通过示例我们可以看出,轴对称是以根节点为基准的,也就是说,子树我们就不要求轴对称(要跟前一道题做区分)。就像示例 1,我们需要比较的是左子树的右子树右子树的左子树是否相等

在这里我们还是使用递归法

  1. 终止条件

    首先要判断两个节点是否为空:

    • 左节点为空,右节点也为空,返回 true
    • 左节点为空,右节点不为空,返回 false
    • 左节点不为空,右节点为空,返回 false

    此时排除了节点为空的情况,可以来判断节点里的值是否相等了:

    • 相等返回 true,不相等返回 false
  2. 单层递归的逻辑

    此时就要来往下递归,传入左节点的右孩子跟右节点的左孩子,再 与(&&) 上传入左节点的左孩子和右节点的右孩子,如果左右堆成就返回 true,有一侧不对称就返回 false

2.3 代码实现

class Solution {
    public boolean isSymmetric(TreeNode root) {
        //先把根节点为null的情况排除掉
        if(root == null) {
            return true;
        }
        //传入根节点的左右子树
        return isSymmetricChild(root.left, root.right);
    }

    public boolean isSymmetricChild(TreeNode leftTree, TreeNode rightTree) {
        //都为null,则返回true
        if(leftTree == null && rightTree == null) {
            return true;
        }
        //因为上面排除了都为null的情况,所以这里只要有一个是null,就返回false
        if(leftTree == null || rightTree == null) {
            return false;
        }
        //都不为null,开始判断里面的值
        if(leftTree.val != rightTree.val) {
            return false;
        }
        //开始递归传入左子树的右节点和右子树的左节点
        //以及左子树的左节点和右子树的右节点,同为true就返回true,否则就只能返回false
        return isSymmetricChild(leftTree.left,rightTree.right) && isSymmetricChild(leftTree.right,rightTree.left);
    }
}

2.4 时空复杂度

时间复杂度为 O(N),每次递归都可以判断一对节点是否堆成,因此最多调用 N / 2 次

空间复杂度最差情况下也是 O(N)


3. 平衡二叉树

原题链接:力扣 110.平衡二叉树

3.1 题目

给定一个二叉树,判断它是否是平衡二叉树

平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1

在这里插入图片描述

3.2 解题思路

在力扣的题目中,默认根节点的深度是 1。要求该树所有节点的左右子树深度相差不超过 1,也就是小于等于 1,那我们就得去遍历,至于是哪种遍历,我们要根据题目需求,它让我们求高度还是求深度

求高度使用后序遍历:因为后序遍历是左右根(LRN),因此父节点可以根据左右节点返回上来的高度数再加一,层层向上,得到树的高度

求深度使用前序遍历:因为前序遍历是根左右(NLR),它能一直向下遍历,而不是向上去返回结果,求得深度

在本题中,我们要求的是深度,做后序遍历可以从底至顶返回子树深度,当前树的深度等于左子树的深度右子树的深度中的最大值 +1。还是经典的递归:

  1. 终止条件

    遇到空节点就终止,返回 0,表示此时以该节点为根节点的树的高度为 0

  2. 单层递归的逻辑

    我们要比较左子树高度和其右子树高度的差值。分别求出其左右子树的高度,然后如果差值小于等于1,则返回 true,否则返回 false,表示已经不是二叉平衡树

3.3 代码实现

class Solution {
    public boolean isBalanced(TreeNode root) {
        //先判断根节点是否为null的情况
        if (root == null) {
            //是就返回true
            return true;
        }
        //求左子树的深度
        int leftH = getHeight(root.left);
        //求右子树的深度
        int rightH = getHeight(root.right);
        //相减的绝对值小于1,则表示以该节点为根节点的树平衡,返回true,再与上该节点的左子树和右子树
        return Math.abs(leftH - rightH) <= 1
                && isBalanced(root.left)
                && isBalanced(root.right);
    }

    //求树的深度
    public int getHeight(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //往下一直递归
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);

        //返回左右子树的深度的最大值,还要加一
        return leftHeight > rightHeight ?
                leftHeight+1 : rightHeight+1;
    }
}

3.4 时空复杂度

时间复杂度为 O(N),最差情况下要遍历所有节点

空间复杂度为 O(N),最差情况下,树退化成链表,递归需要使用 O(N) 的栈空间


结语

这几道题我在一两个月前就已经做过的题,现在回来重新写一遍还是有点吃力。想写成博客,把做题思路顺畅地写出来还是很难。而且二叉树的很多题用递归写很方便,就是不好讲,讲了也不一定能看懂😣请见谅

主要还是因为博主太菜了,力扣的题也刷的很少。大家在刷题的时候没思路可以看看评论区大佬的讲解,懂了后再去自己敲一遍。博主这种菜鸟就是这样做的,虽然提升有点慢,但也多多少少吸收点做题经验

新手刷题常常会出现明明之前看题解后做过,过段时间再回来还是一点做不出来,正常(我的现状😭),只能多刷几遍,共勉吧家人们

希望大家能喜欢这篇文章,有总结不到位的地方还请多多谅解,若有出现纰漏,希望大佬们看到错误之后能够在私信或评论区指正,博主会及时改正,共同进步!

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

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

相关文章

间接平差——以水准网平差为例 (python详细过程版)

目录 一、原理概述二、案例分析三、代码实现四、结果展示本文由CSDN点云侠原创,间接平差——以水准网平差为例 (python详细过程版),爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、原理概述 间接平差的函数模型和随机模型…

算法与数据结构汇总

刷题建议步骤 求职硬通货&#xff1a;一&#xff0c;好的学历&#xff0c;这个要下血本。本科&#xff0c;可以考研&#xff0c;读研。专科&#xff0c;可以专升本&#xff0c;再考研&#xff0c;读研&#xff0c;二&#xff0c;软考&#xff0c;一年考两次&#xff0c;有些科…

MySQL:表的约束

文章目录 0.小知识&#xff0c;数据转化1.空属性(非空约束)2.默认值&#xff08;default&#xff09;3.comment&#xff08;列描述&#xff09;4.zerofill(显示约束)5.primary key(主键约束)6.auto_increment(自增长)7.unique(唯一键)8.foreign key (外键)9.综合表结构的设计 表…

Android 版本与 API level 以及 NDK 版本对应

采用 Android studio 开发 Android app 的时候&#xff0c;需要选择支持的最低 API Level 和使用的 NDK 版本&#xff0c;对应开发 app 的最低 SDK 版本&#xff1a; 在 app 的 build.gradle 文件里&#xff0c;对应于代码如下&#xff1a; 目前各版本的占有率情况如下&#xf…

docker不删除容器更改其挂载目录

场景&#xff1a;docker搭建的jenkins通常需要配置很多开发环境&#xff0c;当要更换挂载目录&#xff0c;每次都需要删除容器重新运行&#xff0c;不在挂载目录的环境通常不会保留。 先给一个参考博客docker不删除容器&#xff0c;修改容器挂载或其他_jenkins 修改容器挂载do…

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的…

Gradle的settings.gradle.kts你真的理解吗?

你还在用.gradle文件吗&#xff1f;例如build.gradle、settings.gradle&#xff0c;那么你就out了。现在我们有必要了解一下kts脚本了。在Android项目中&#xff0c;默认有3个文件可以替换成kts脚本&#xff0c;即project的build.gradle、app模块的build.gradle和project的sett…

数据库(5)——DDL 表操作

表查询 先要进入到某一个数据库中才可使用这些指令。 SHOW TABLES; 可查询当前数据库中所有的表。 表创建 CREATE TABLE 表名( 字段1 类型 [COMMENT 字段1注释] ...... 字段n 类型 [COMMENT 字段n注释] )[COMMENT 表注释]; 例如&#xff0c;在student数据库里创建一张studen…

哈希表---闭散列

闭散列 当我们用哈希函数的时候&#xff0c;其中一个就是除留余数法 取这个表的长度len,按照哈希函数&#xff1a;Hash(key) key% len,将这个位置映射到表中 通过上面的除留余数法&#xff0c;会有哈希碰撞的问题&#xff0c;可以通过闭散列来解决 闭散列也叫开放定址法&am…

Django与前端框架协作开发实战:高效构建现代Web应用

title: Django与前端框架协作开发实战&#xff1a;高效构建现代Web应用 date: 2024/5/22 20:07:47 updated: 2024/5/22 20:07:47 categories: 后端开发 tags: DjangoREST前端框架SSR渲染SPA路由SEO优化组件库集成状态管理 第1章&#xff1a;简介 1.1 Django简介 Django是一…

新加坡多ip服务器在跨境电商中有哪些优势?

新加坡多IP服务器**在跨境外贸业务中具有明显的优势&#xff0c;适合需要高性能和网络稳定性的业务场景。Rak部落小编为您整理发布新加坡多ip服务器在跨境电商中有哪些优势? 以下是一些具体的优势&#xff1a; 1. **地理位置优越**&#xff1a;新加坡作为亚太地区的国际商业和…

mysql图形化界面及将mysql注册成后台程序

安装图形化界面版本 右键新建数据库 字符集使用utf8防止以后数据库中存在中文字符导致乱码 将mysql注册成后台程序 cmd进入命令行界面 切换路径到cd /mysql/bin 将mysql注册成后台程序 mysqld.exe --install mysql1 (失败&#xff0c;说明没有权限) 以管理员身份打开成功…

R语言:Mantel Test分析与绘图

Mantel Test 1.什么是Mantel Test2. R语言代码13. R语言代码2 1.什么是Mantel Test Mantel test分析对两个矩阵相关关系进行检验。可以用在生态学上&#xff0c;用来检验群落距离矩阵(如 Bray-Curtis distance matrix)和环境变量距离矩阵(如 pH, 温度 或者地理位置的差异矩阵)之…

MySQL——MySQL目录结构

MySQL安装完成后&#xff0c;会在磁盘上生成一个目录&#xff0c;该目录被称为MySQL的安装目录。在MySQL的安装目录中包含了启动文件、配置文件、数据库文件和命令文件等。 下面对 MySQL 的安装目录进行详细讲解 (1)bin 目录 : 用于放置一些可执行文件,如 mysql.exe、mysqld. …

Java面试八股之什么是锁消除和锁粗化

什么是锁消除和锁粗化 锁消除&#xff08;Lock Elimination&#xff09;&#xff1a; 锁消除是Java虚拟机&#xff08;JVM&#xff09;进行的一种高级优化策略&#xff0c;旨在消除那些没有必要存在的同步操作&#xff0c;以减少不必要的性能开销。这一优化发生在即时编译器&a…

MT7628原厂Uboot修改交互串口

工作中&#xff0c;遇到用户用Skylab的SKW92A模组&#xff0c;在参考设计时&#xff0c;将UART接口预留错的情况&#xff0c;对于这种情况&#xff0c;需要将原厂SDK默认的交互串口UART0&#xff0c;改为UART1。在开发过程中&#xff0c;经常需要在Uboot阶段升级固件&#xff0…

抖音运营_抖音推荐算法的机制

目录 一 抖音流量推荐算法机制 二 4大关键指标 三 完播率 1 黄金3秒 2 内容严谨 3 期待感 4 用户痛点 5 通俗易懂 四 转发量 1 分享需求 2 分享快乐 3 共情表达 4 正义传播 五 评论量 1 话题性 2 争议性 3 参与感 4 评论回评 六 点赞量 1 情感共鸣 2 用户喜…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十)- JUC(6)

目录 wait , notify wait vs sleep 正确使用方法 同步保护性暂停 join的源码 Future 异步生产者/消费者模型 定义 Park & Unpark 原理 wait , notify 小故事小南需要烟才能工作&#xff0c;但它又要占这锁让别人无法进来。那么这个时候开一个waitSet相当于就是休…

druid 1.2.14,application.yaml配置文件中,如何进行数据库加密配置

步骤一&#xff1a;先生成加密的密码&#xff1a; 步骤二&#xff1a;配置application.yaml文件&#xff1a; spring:datasource:driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid:username: rootpassword: aPJ35saFz6ASmnmNt…

ASP.NET MVC 快速入门(图文版)

今年是2024年了&#xff0c;没有多少人在ASP.NET 去做开发&#xff0c;都使用ABP框架 &#xff0c;不过我们仍然需要了解ASP.NET MVC 的一个开发流程 MVC概述 MVC是当前比较流行的WEB程序开发模式之一&#xff0c;ASP.NET MVC是.Net对MVC的一种实现。MVC&#xff08;Model View…