二叉树OJ题(检查两颗数是否相同、另一棵树的子树、翻转二叉树、判断平衡二叉树)

news2025/7/28 3:27:57

文章目录

  • 二叉树OJ题
    • 一、 检查两颗数是否相同
      • 1.思路
      • 2.解题步骤
      • 3.代码
    • 二、另一棵树的子树
      • 1.思路
      • 2.代码
    • 三、翻转二叉树
      • 1.思路
      • 2.解题步骤
      • 3.代码
    • 四、判断平衡二叉树

二叉树OJ题


一、 检查两颗数是否相同

在这里插入图片描述

1.思路

1.两个树,在保证结构相同的同时,结点的值也要相同

2.一个为空一个不为空,结构不同。都为空,结构相同。都不为空,判断值是否相同

3.先判断根节点是否一样

4.再判断左树是否一样,然后判断右树

2.解题步骤

  • 1.判断两棵树的结构是否相同
  • 2.如果一个结点为空,一个结点不为空,则证明结构不一致,直接返回false
  • 3.结构一致说明都为空,或者都不为空,都不为空包括值相同和值不同两种情况,都为空返回false
  • 4.如果都不为空并且值不同,返回ture
  • 5.到此,判断好了根节点的情况,先递归左子树,左子树判断完,再递归右子树进行判断
  • 6.最后返回,两个子树取到的返回值相与,出现false则返回false
  • 时间复杂度:o(min(m,n))
  • 空间复杂的:o (min(m,n))

3.代码

    //判断两棵树是否相同
    public static boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q != null || p != null && q == null) {
            return false;//保证结构相同
        }//要么都是空,要么都不是空
        if (p == null && q == null) {
            return true;//结点都为空,结构一样
        }
        if (p.val != q.val) {
            return false;//结构一样的情况下,值也要相同
        }
        //pq都不空且根节点的值都相同
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        //递归得到左右子树返回回来的值
    }

二、另一棵树的子树

在这里插入图片描述

1.思路

0.需要调用刚写的判断两棵树是否相同

1.判断两个树是否完全相同

2.不相同,判断是不是和左子树相同

3.再判断是不是和右子树相同

4.都不相同,返回false

5.当root等于空时返回false,避免发生空指针异常

2.代码

    //判断两棵树是否相同
    public  boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q != null || p != null && q == null) {
            return false;//保证结构相同
        }//要么都是空,要么都不是空
        if (p == null && q == null) {
            return true;//结点都为空,结构一样
        }
        if (p.val != q.val) {
            return false;//结构一样的情况下,值也要相同
        }
        //pq都不空且根节点的值都相同
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        //递归得到左右子树返回回来的值
    }

    //另一棵树的子树
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if (root == null){
            return false;//避免空指针异常
        }

        if ( isSameTree(root,subRoot)){
            return true;//先判断两个树是否完全一样
        }
        if (isSubtree(root.left,subRoot)){
            return true;//判断是不是和左子树相同
        }
        if (isSubtree(root.right,subRoot)){
            return true;//判断是不是和右子树相同
        }
        return false;//没有找到,返回false
    }
  • 时间复杂度:o ( s * t )
  • 空间复杂度:o (Max (ds , dt ))

三、翻转二叉树

在这里插入图片描述

1.思路

1.翻转整棵树

2.先把根节点的左子树和右子树交换

3.再交换子树上的子树

2.解题步骤

  • 先判断该树是否为空
  • 不为空,用tmp存储左孩子
  • 交换根结点的左子树和右子树
  • 先交换左子树中的左右子树,再交换右子树当中的
  • 最后翻转完成,返回根结点

3.代码

    //翻转二叉树
    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.思路

1.每个结点都要判断左右子树的高度差的绝对值不超过 1 。也就是说: | 高度差 |<2

2.root为空,返回true

3.左右子树的高度差要小于2

4.左右子树都要保存平衡

2.代码

class Solution {
    //判断平衡二叉树
    public boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true; //为空,返回true
        }
        int leftHeight = maxDepth(root.left);//得到左子树的高度
        int rightHeight = maxDepth(root.right);//得到右子树的高度
        return Math.abs(leftHeight - rightHeight) < 2//左右树高度差的绝对值<2
                && isBalanced(root.left) && isBalanced(root.right);
        //并且满足左右子树都是平衡的

    }
    public int maxDepth(TreeNode root){//求高度
        if(root == null){
            return 0;
        }
        int leftHeight = maxDepth(root.left);
        int rightHeight = maxDepth(root.right);
        return leftHeight>rightHeight?leftHeight+1:rightHeight+1;

    }
}
  • 时间复杂度:o ( n2 ) :求高度的时间复杂度o(n),有n个结点,所以时间复杂度为 n2

如何改成时间复杂度为 o(n)?

1.在求左右树高度的时候,会重复求子树的高度,子树的高度是不断递归返回上来的和,

2.求一个子树的高度时,已经计算过一遍它子树的子树高度,重复计算

3.也就是说,在之前求高度的时候,高度可能已经不平衡了,但是返回的是最大值+1,没有考虑度差的绝对值<2的情况

4.所以可以再求高度的时候,就判断高度差,不平衡直接返回,避免再重复计算

    public boolean isBalanced(TreeNode root) {
        return maxDepth(root)>=0;//只需要判断返回的值是否>=0

    }
    public int maxDepth(TreeNode root){//求高度
        if(root == null){
            return 0;
        }
        int leftHeight = maxDepth(root.left);
        if(leftHeight<0){//如果左子树有返回-1的值,说明有不平衡的情况
            return -1;//不用进入右子树了,直接返回
        }
        int rightHeight = maxDepth(root.right);
        if(rightHeight<0){//如果右子树出现-1,直接返回,不用进行后面的运算
            return -1;
        }
        if(Math.abs(leftHeight-rightHeight)<2){//求高度的时候就判断高度差
            return Math.max(leftHeight,rightHeight)+1;//符合返回最大值+1
        }else {
            return -1;//不符合返回-1;
        }

    } 
 }

经过改进,时间复杂度从o ( n2 ) 降到了o(n)。

点击移步博客主页,欢迎光临~

偷cyk的图

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

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

相关文章

语音信号处理给音乐信号增加房间混响效果

语音信号处理给音乐信号增加房间混响效果 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务 1 源码布局 2 源文件与音频文件和生成文件 3 编译方法

数据结构第一课-----------数据结构的介绍

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

抖音招聘报白怎么处理?

抖音直播招聘报白是通过抖音直播方式展现职位信息&#xff0c;并与求职者进行互动的招聘方式。在抖音平台上&#xff0c;企业或者人力资源公司可以通过直播的形式&#xff0c;将职位以视频直播的方式展现出来。通过抖音直播招聘报白&#xff0c;企业或者人力资源公司可以利用抖…

C#中LINQtoSQL的设置与连接

目录 一、首次安装LinqToSql类 二、非首次安装LinqToSql类 1.接受原有数据库连接 2.建立新的数据库连接 3.建立本地数据库连接 LINQ&#xff08;Language-Integrated Query&#xff0c;语言集成查询&#xff09;是微软公司提供的一项新技术&#xff0c;它能够将查询功能直…

(vue)进入页面自动触发点击事件

(vue)进入页面自动触发点击事件 背景&#xff1a;进入页面后需根据表单默认值查询出数据 效果&#xff1a; 1.alert弹出说明已进入点击事件中 2.成功显示 页面写法 思路&#xff1a;使用 ref 属性将 div 标签绑定到了 Vue 实例中的 clickMe 变量上。在 mounted 钩子函数中&…

IDEA初步入门

1 安装 现在的系统更迭很快&#xff0c;很多软件都只支持win10 和 11了&#xff0c;但我们过时党还在用win7. 所以就必须找到合适的版本。在windows 7 64位系统下&#xff0c;可以使用IDEA 2020.1.4版本。 在Jetbrain官方下&#xff0c;找到历史版本&#xff0c;找到windows版…

基于知识库的chatbot或者FAQ

背景 最近突然想做一个基于自己的知识库&#xff08;knowlegebase&#xff09;的chatbot或者FAQ的项目。未来如果可以在公司用chatgpt或者gpt3.5之后的模型的话&#xff0c;还可以利用gpt强大的语言理解力和搜索出来的用户问题的相关业务文档来回答用户在业务中的问题。 Chat…

react-markdown支持83版本的Chrome,解决Object.hasOwn is not a function问题

旧版浏览器支持 react-markdown用了一个ES2022的api&#xff0c;Object.hasOwn测试的时候一切正常&#xff0c;当我切换到生成环境的旧版的83的Chrome之后&#xff0c;发现会报Object.hasOwn is not a function这个错误。 https://github.com/remarkjs/react-markdown/issues/…

智能运维第一步:HDD磁盘故障预测

当今数字化时代&#xff0c;信息技术扮演着企业和组织运营的关键角色。然而&#xff0c;随着IT环境不断复杂化和数据量激增&#xff0c;传统的运维管理方法已经无法满足日益增长的需求。为应对这一挑战&#xff0c;智能运维&#xff08;Artificial intelligence for IT operati…

在Jetpack Compose中使用Paging 3实现无限滚动

在Jetpack Compose中使用Paging 3实现无限滚动 本文将介绍在Jetpack Compose中进行分页加载。分页加载意味着一次只加载应用程序中的小数据块。 假设您在服务器上有大量数据&#xff0c;并且您希望在UI上显示这些数据。显然&#xff0c;您不希望一次性加载所有数据。您希望每次…

Docker(1)——安装Docker以及配置阿里云镜像加速

目录 一、简介 二、安装Docker 1. 访问Docker官网 2. 卸载旧版本Dokcer 3. 下载yum-utils&#xff08;yum工具包集合&#xff09; 4. 设置国内镜像仓库 5. 更新yum软件包索引 6. 安装Docker 7. 启动Docker 8. 卸载Docker 三、阿里云镜像加速 1. 访问阿里云官网 2. …

C++——类和对象之拷贝构造

拷贝构造 本章思维导图&#xff1a; 注&#xff1a;本章思维导图对应的xmind文件和.png文件都已同步上传到”资源“ 如果我们想要用一个已经存在的对象实例化一个与之完全相同的对象&#xff0c;怎么做呢&#xff1f; C提供了一个简单的方法——拷贝构造 拷贝构造是C类里面默…

如何利用python连接讯飞的星火大语言模型

星火大模型是科大讯飞推出的一款人工智能语言模型&#xff0c;它采用了华为的昇腾910 AI处理器。这款处理器是一款人工智能处理器&#xff0c;具有强大的计算能力和高效的能耗控制能力。 华为昇腾910 AI处理器采用了创新的Da Vinci架构&#xff0c;这种架构在设计上充分考虑了…

均值、方差、标准差

1 中间值和均值 表现&#xff02;中间值&#xff02;的统计名词&#xff1a; a.均值:   mean&#xff0c;数列的算术平均值&#xff0c;反应了数列的集中趋势,等于有效数值的合除以有效数值的个数&#xff0e;b.中位值:  median&#xff0c;等于排序后中间位置的值&#x…

工会排队营销玩法,让消费者乐于参与其中

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 工会…

DC/DC 隔离模块MGS102405、MGS102412、MGS60505、MGS62405、MGS62415直流转换器 Module

概述 MG DC-DC转换器采用行业标准尺寸&#xff0c;包括SIP6、SIP8、1 “ X 1 ”和1 “ X 2 ”。这些模块具有DC4.5至13V/DC9至36V/DC18至76V的宽输入范围和DC1500V&#xff08;1分钟&#xff09;的隔离电压。其他功能包括内置过流保护电路&#xff08;自动恢复&#xff09;、内…

PO- Target XSD requires a value错误处理

问题描述&#xff1a; . Values missing in queue context. Target XSD requires a value forhis element. but the taroet-field mappina does not create one. 原因分析&#xff1a; Xsd即DT、MT对应的字段&#xff0c;上面没有具体写那个字段&#xff0c;但可以判断是消息…

对象存储那点事

在很长的一段时间里&#xff0c;DAS、SAN 和 NAS 这三种架构几乎统治了数据存储市场。所有行业用户的数据存储需求&#xff0c;都是在这三者中进行选择。 然而&#xff0c;随着时代的发展&#xff0c;一种新的数据存储形态诞生&#xff0c;开始挑战前面三者的垄断地位。没错&am…

0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)

大纲 mapreduce完整代码参考资料 在《0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)》一文中&#xff0c;我们发现如果窗口内元素个数没有达到窗口大小时&#xff0c;计算个数的函数是不会被调用的。如下图中红色部分 那么有没有办法让上图中&#xff08;B,2&…

一次不接受ElasticSearch官方建议导致的事故

记录一下 一次Elasticsearch集群事故分析、排查、处理 背景介绍 事故发生的ElasticSearch集群共有7台机器&#xff1a; 127.0.204.193127.0.204.194127.0.204.195127.0.220.73127.0.220.74127.0.220.220127.0.220.221 其中193、194、195的机器配置一样&#xff0c;具体如下&…