[Collection与数据结构] 二叉树(二):二叉树精选OJ例题(上)

news2024/11/25 12:35:58

1. 判断是否为相同的二叉树

OJ链接
在这里插入图片描述

public boolean isSameTree(Node p, Node q) {
        if (p == null && q != null || p != null && q == null){//结构不同
            return false;
        }
        if (p == null && q == null){//结构相同,都是空树
            return true;
        }
        if (p.value != q.value){//结构相同,不是空树,但是值不一样
            return false;
        }
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);//向下递归
    }

整体思路:
首先判断结构是否相同,一种是不同,这种直接返回false,另一种是相同,一种是都为空,这种直接返回true,一种是都不为空相同,那么进行下一步,判断值是否相同,相同向下递归,不相同返回false.
在这里插入图片描述

2. 判断是否为子树

OJ链接
在这里插入图片描述

public boolean isSubtree(Node root, Node 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;
    }
public boolean isSameTree(Node p, Node q) {
        if (p == null && q != null || p != null && q == null){//结构不同
            return false;
        }
        if (p == null && q == null){//结构相同,都是空树
            return true;
        }
        if (p.value != q.value){//结构相同,不是空树,但是值不一样
            return false;
        }
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);//向下递归
    }

整体思路:
首先判断根结点是否为空,如果为空,返回false,之后从根节点判断两棵树是否是相同的树,如果是,返回true,如果不是,则向左子树和右子树递归,判断左子树和右子树是否和所给的树相同.
在这里插入图片描述

3. 翻转二叉树

OJ链接
在这里插入图片描述

public Node invertTree(Node root) {
        if (root == null){
            return null;//空树返回null
        }
        Node tmp = null;
        tmp = root.left;
        root.left = root.right;
        root.right = tmp;//交换左结点和右结点
        invertTree(root.left);
        invertTree(root.right);//向下递归
        return root;//返回根节点
    }

这里需要注意的一点就是需要引入第三个结点来交换两个结点的位置.只要想到这一点,问题便不是很大.

4. 判断是否是平衡二叉树

该题为字节跳动面试真题
OJ链接
在这里插入图片描述

  1. 普通解法
public boolean isBalanced(Node root) {
        if(root == null){//空树返回true
            return true;
        }
        int hightleft = getHeight(root.left);
        int hightright = getHeight(root.right);//获取两棵树的高度,这里设置两棵树的高度是有必要的
        //如果不保存这里的值,后面会又很多重复获取高度的操作,效率会大大降低
        if(Math.abs(hightleft-hightright)<2 && isBalanced(root.left)
                && isBalanced(root.right)){//根结点所在的树和以左子树右子树为根节点的树都符合条件
            return true;
        }else{
            return false;
        }
    }
public int getHeight(Node root) {
        if (root == null){
            return 0;
        }
        return Math.max(getHeight(root.left),getHeight(root.right))+1;
    }

递归思路如图:
在这里插入图片描述

在图中我们可以看到在从根节点递归到作左树的根结点的时候,就已经遇到了不平衡,但是在传入左树的根节点的时候,还是要向下递归,这种做法就使得每一个结点都要向下递归,时间复杂度达到了O(n2),这样就是多此一举的做法,我们希望遇到不平衡就不再向下递归,这种做法是面试官青睐的做法.

public int getHeight2(Node root){
        if (root == null){
            return 0;//结点为空返回0
        }
        int leftHeight = getHeight2(root.left);
        int rightHeight = getHeight2(root.right);//获取高度
        if (leftHeight>=0 && rightHeight >=0 && Math.abs(leftHeight-rightHeight)<2 ){
            return Math.max(leftHeight,rightHeight)+1;//返回的值不是-1或者是左右树高度差小于2,返回可以获取的高度
        }else{
            return -1;//否者返回-1
        }
    }
    public boolean isBalanced2(Node root) {
        if(root == null){
            return true;
        }
        return getHeight(root)>=0;//看root的返回值是否为负数,返回值不为负数,说明平衡,否则不平衡
    }

递归思路:
在这里插入图片描述
这样的做法就是比较高效的,在从根节点向下递归的时候,如果一旦遇到了不平衡,立即返回-1,对应条件是Math.abs(leftHeight-rightHeight)<2,一旦有一个结点返回了-1,之后的每一个结点在返回的时候均返回-1,对应的是leftHeight>=0 && rightHeight >=0.在最后只需要判断root结点拿到的值是否是-1即可.

5. 判断是否是对称二叉树

OJ链接
在这里插入图片描述

public boolean isSymmetric(Node root) {
        if (root == null){
            return true;//为空返回true
        }
        return isSymmetricChild(root.left,root.right);//根节点无需判断,则判断子树是否对称
    }

public boolean isSymmetricChild(Node left,Node right){
    if (left == null && right == null){
        return true;//结构相同,两个都为空,返回true
    }
    if (left != null && right == null || left == null && right != null){
        return false;//结构不同,返回false
    }
    if (left.value != right.value){
        return false;//结构相同,值不一样,返回false
    }
    return isSymmetricChild(left.left,right.right) && isSymmetricChild(left.right,right.left);
    //向下递归,判断左树的左和右树的右,左树的右和右树的左是否相同,不相同返回false
}

整体思路:
如果这棵树为null,则符合对称树的条件,返回true,之后递归到左右子树,判断左右子树的根节点是否相同(这里判断根结点是否相同的思路和判断两棵树是否是同一棵树的思路相同),如果不同,则返回false,如果相同,则递归左子树的左,右子树的右;左子树的右和右子树的左即可(判断它们是否相同).
在这里插入图片描述

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

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

相关文章

机器人流量激增:恶意机器人活动升级与新型规避技术挑战企业安全防御

近日&#xff0c;根据Cyber News引用Thales Imperva Bad Bot发布的最新研究报告&#xff0c;揭示了一个令人警醒的现象&#xff1a;2023年&#xff0c;互联网总流量中的49.6%由机器人贡献&#xff0c;相较于上一年增长了2%&#xff0c;创下了自2013年监测以来的历史新高。这一显…

希亦、固特、大宇超声波清洗机值不值得买?宝藏机型测评争霸

在当代生活的快节奏中&#xff0c;眼镜成了我们不可或缺的伙伴&#xff0c;无论是助力视力的提升还是时尚造型的加分项。然而&#xff0c;许多人忽视了眼镜清洁的重要性&#xff0c;不知道不清洗眼镜会带来诸多危害&#xff0c;从而影响健康和生活质量。长时间累积的污垢、油脂…

苹果开发初学者指南:Xcode 如何为运行的 App 添加环境变量(Environmental Variable)

概览 Xcode 15 在运行 SwiftUI 代码时突然报告如下警告&#xff1a; Error: this application, or a library it uses, has passed an invalid numeric value (NaN, or not-a-number) to CoreGraphics API and this value is being ignored. Please fix this problem. 不仅如此…

【智能算法】花朵授粉算法(FPA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2012年&#xff0c;Yang等人受到自然界花朵授粉过程启发&#xff0c;提出了鸭群算法&#xff08;Flower Pollination Algorithm, FPA&#xff09;。 2.算法原理 2.1算法思想 FPA基于自然界花朵授…

idea项目启动异常:Command line is too long.

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; idea中启动项目报错&#xff1a; 解决方案 在idea 的运行配置中&#xff0c;修改enviroment下的shorten command line 为jar manifest 注&#xff1a; 有时shorten command line 可能不是默认存在的…

Kafka复习

消息中间件的作用: 异步处理: 与并行相比,虽然减少了时间,但是还是得等待其他线程执行完,但是消息中间件对于简单的业务处理,还要引入一个中间件也比较复杂如果我投递了简历之后需要发送成功邮件以及短信,就可以交给消息中间件就像数据库、redis数据一致性,需要用到延迟…

揭秘网上问卷调查:多样化类型助力数据收集

在当今数字化时代&#xff0c;问卷调查作为一种便捷、高效的数据收集和分析方式&#xff0c;被广泛运用于市场调研、学术研究、消费者反馈等领域。而在网上进行问卷调查更是提高了调查效率和覆盖范围&#xff0c;因此&#xff0c;了解网上的问卷调查类型对于设计合适的调查问卷…

如何使用Postgres的JSONB数据类型进行高效查询

文章目录 解决方案1. 创建包含JSONB列的表2. 插入JSON数据3. 使用GIN索引加速查询4. 执行高效的JSONB查询 示例代码解释 PostgreSQL的JSONB数据类型提供了一种灵活的方式来存储和查询JSON格式的数据。JSONB不仅允许你在PostgreSQL数据库中存储JSON文档&#xff0c;而且还对这些…

万字长文带你APK反编译重签名aabapks转换

Android反编译 反编译&#xff08;Decompilation&#xff09;是将已编译的程序&#xff08;比如二进制代码&#xff09;转换回更高级别的编程语言代码的过程。这通常用于理解程序的工作原理&#xff0c;进行软件审计&#xff0c;恢复丢失的源代码&#xff0c;或者进行教学研究…

CleanAmp™ dNTP应用:24min完成三重qPCR

试剂&#xff1a;CleanAmp™ PCR Kit 仪器&#xff1a;Mastercycler ep realplex4 S qPCR instrument 品牌&#xff1a;Trilink 国内授权代理&#xff1a;欣博盛生物 分子诊断需求的不断增长&#xff08;如新冠核酸检测&#xff09;&#xff0c;要求所用检测试剂、设备能在更…

OpenCV的查找命中或未命中

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV4.9更多形态转换 下一篇&#xff1a;OpenCV4.10使用形态运算提取水平线和垂直线 目标 在本教程中&#xff0c;您将学习如何使用 Hit-or-Miss 转换&#xff08;也称为 Hit-and-Miss 转换&…

如何查看已使用的IP

如何查看已使用的IP 一、用cmd登录&#xff08;winr&#xff09; 二、用命令查看IP 在cmd命令窗口输入“ipconfig”命令&#xff0c;按下键盘上的回车键 这时会在cmd命令窗口看见自己电脑的IP地址&#xff0c;在命令窗里找到你的“以太网适配器 以太网”或者“无线局域网适配器…

网络爬虫入门

爬虫&#xff08;也被称为网络爬虫或网络蜘蛛&#xff09;是一种自动化程序&#xff0c;它可以在互联网上自动抓取数据。爬虫的基本工作原理通常包括以下几个步骤&#xff1a;发送请求&#xff1a;爬虫向目标网站发送HTTP请求&#xff0c;请求网页内容。接收响应&#xff1a;爬…

Spring AOP的实现方式与原理

目录 认识IOC与AOP AOP的实现方式 Aspect注解实现AOP 自定义注解实现AOP Spring AOP原理 代理模式 静态代理和动态代理 JDK动态代理 CGLIB动态代理 Spring AOP实现的哪种代理 认识IOC与AOP IOC又称为控制反转,也就是控制权发生了反转.在传统的程序中,我们是需要自己…

TCP/IP协议—HTTP

TCP/IP协议—HTTP HTTP协议HTTP通讯特点HTTP通讯流程 HTTP请求报文请求方法 HTTP应答报文状态码 HTTP协议 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一种请求-响应的协议&#xff0c;用户可以通过HTTP向服务器上传、下载数据。HT…

美易官方:人民币国际支付占比升至近5%

随着全球金融市场的不断发展和数字化进程的加速&#xff0c;人民币的国际支付地位逐渐提升&#xff0c;成为备受瞩目的焦点。最近的数据显示&#xff0c;人民币在国际支付中的占比已经升至近5%&#xff0c;自11月以来已成为第四大交易货币。这一变化不仅反映了中国经济的崛起和…

AI实景无人直播自动卖卷系统,开创了实体商家直播自运营先河。

AI实景无人直播自动卖卷系统&#xff0c;开创了实体商家直播自运营先河。 从当下这一刻起&#xff0c;拒绝内耗&#xff0c;做行动的巨人。因为&#xff0c;命运不会偏袒任何人&#xff0c;却会眷顾一直朝着光亮前进的人。 《人民日报》 随着新媒体的快速发展&#xff0c;很…

使用Flask和Flask-JWT-Extended保护API免受跨站请求攻击

在本文中&#xff0c;我们将探讨如何使用Flask和Flask-JWT-Extended库来保护您的API免受跨站请求攻击&#xff08;CSRF&#xff09;。我们将首先简要介绍CSRF攻击的概念&#xff0c;然后详细说明如何使用Flask-JWT-Extended库来保护您的API。 什么是跨站请求攻击&#xff08;C…

STM32学习和实践笔记(15):STM32中断系统

中断概念 CPU执行程序时&#xff0c;由于发生了某种随机的事件(外部或内部)&#xff0c;引起CPU暂 时中断正在运行的程序&#xff0c;转去执行一段特殊的服务程序(中断服务子程序 或中断处理程序)&#xff0c;以处理该事件&#xff0c;该事件处理完后又返回被中断的程序 继…

HP ProLiant DL380 Gen9 服务器 BIOS 中文设置教程

HP ProLiant DL380 Gen9 服务器 BIOS 中文设置教程 服务器开机,按F9,进入System Utilities 找到Select Language,目前设置的为English 英文 选中Select Language,按回车键 将语言由English改成中文(简体) 可以看到 中文字符 按回车键进行保存