【二叉树】力扣OJ题

news2024/9/20 16:34:51

文章目录

  • 前言
  • 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) 的栈空间


结语

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

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

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

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

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

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

相关文章

Scala 入门介绍和环境搭建

一、简介 Scala 是一门以 Java 虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言 (静态语言需要提前编译&#xff0c;如&#xff1a;Java、c、c 等&#xff0c;动态语言如&#xff1a;js)Scala 是一门多范式的编程…

Spring中@Component注解

Component注解 在Spring框架中&#xff0c;Component是一个通用的注解&#xff0c;用于标识一个类作为Spring容器管理的组件。当Spring扫描到被Component注解的类时&#xff0c;会自动创建一个该类的实例并将其纳入Spring容器中管理。 使用方式 1、基本用法&#xff1a; Co…

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.综合表结构的设计 表…

【运维】Linux 端口管理实用指南,扫描端口占用

在 Linux 系统中&#xff0c;你可以使用以下几种方法来查看当前被占用的端口&#xff0c;并检查 7860 到 7870 之间的端口&#xff1a; 推荐命令&#xff1a; sudo lsof -i :7860-7870方法一&#xff1a;使用 netstat 命令 sudo netstat -tuln | grep :78[6-7][0-9]这个命令…

Java+Spring Boot +MySQL + MyBatis Plus一款数字化管理平台源码:云MES系统

JavaSpring Boot MySQL MyBatis Plus一款数字化管理平台源码&#xff1a;云MES系统 MES是为企业提供制造全过程的信息化产品&#xff0c;支持企业智能制造。MES可实现与企业的ERP、PDM等其他信息化系统进行无缝连接&#xff0c;也可与现场生产设备进行连接、数据采集&#xff…

牛客网刷题 | BC97 回文对称数

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 今天牛牛学到了回文…

线程池,日志

所要用到的知识点&#xff1a; 多线程的创建 生产消费模型&#xff0c; 线程锁 条件变量 代码&#xff1a; 线程池日志

留守儿童|基于SprinBoot+vue的留守儿童爱心网站(源码+数据库+文档)

留守儿童爱心网站 目录 基于SprinBootvue的留守儿童爱心网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&…

gnocchi学习小结

背景 总结gnocchi 4.4版本gnocchi-metricd工作流程 入口 gnocchi.cli.metricd metricd stop after processing metric默认为0&#xff0c;调servicemanager run MetricdServiceManager __init__ 服务逻辑封装到MetricdServiceManager初始化中 主要由MetricProcessor, Met…

Linux自动重启系统脚本测试工具

前言 脚本允许用户指定重启的次数和重启间隔时间&#xff0c;并自动生成相应的定时任务。通过使用这个脚本&#xff0c;系统管理员可以轻松地设置重启测试。每次重启操作都会被记录下来&#xff0c;以便用户随时了解测试情况。 一、脚本 #!/bin/bashif [ "$1" &qu…

[数组查找]1.图解线性查找及其代码实现

线性查找 线性查找是一种在数组中查找数据的算法。与二分查找不同&#xff0c;即便数据没有按顺序存储&#xff0c;也可以应用线性查找。线性查找的操作很简单&#xff0c;只要在数组中从头开始依次往下查找即可。虽然存储的数据类型没有限制&#xff0c;但为了便于理解&#x…

【机器智能】:AI机器学习在医疗服务的广泛应用与实践案例

目录 引言一&#xff0c;什么是机器学习二&#xff0c;AI在医学影像诊断中的应用三&#xff0c;AI在个性化治疗方案设计中的应用四&#xff0c;医疗图像识别技术五&#xff0c;医疗语言识别技术六&#xff0c;结语 引言 随着人工智能&#xff08;AI&#xff09;和机器学习技术…

[书生·浦语大模型实战营]——第三节:茴香豆:搭建你的 RAG 智能助理

0.RAG 概述 定义&#xff1a;RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息片段&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺…

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

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

Asp .Net Core 系列:集成 CAP + RabbitMQ + MySQL(含幂等性)

简介 官网&#xff1a;https://cap.dotnetcore.xyz/ CAP 是什么&#xff1f; 是一个 EventBus&#xff0c;同时也是一个在微服务或者 SOA 系统中解决分布式事务问题的一个框架。它有助于创建可扩展&#xff0c;可靠并且易于更改的微服务系统。 什么是 EventBus&#xff1f;…

Pytorch深度学习实践笔记6(b站刘二大人)

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

项目管理-人力资源管理

目录 一、概述 二、人力资源计划编制 2.1 概述 2.2 层次结构图 2.3 分配任务矩阵 三、组建项目团队 3.1 概述 3.2 内部谈判 3.3 事先分派 3.4 外部招聘 3.5 虚拟团队 3.6 总结 四、项目团队建设 4.1 概述 4.2 团队发展过程 4.2.1 概述 4.2.2 形成期 4.2.3 震…

【每日力扣】84. 柱状图中最大的矩形 与 295. 数据流的中位数

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为…

我用LLaMA-Factory微调大模型来实现商品评论情感分析,准确率高达91.70%

大家好&#xff0c;我是程序锅。 最近在modelscope上闲逛的时候&#xff0c;在数据集板块发现有一个商品评论情感预测数据集。这个数据集源自一个比赛&#xff0c;它的目的是为了预测电商平台顾客的评论是好评还是差评。 数据示例如下所示&#xff08;其中0代表差评&#xff…

电子电器架构 - AUTOSAR软件架构介绍

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