当前位置: 首页 > news >正文

二叉树(下)

目录

判断树是否相同

判断树是不是另一棵树的子树

二叉树翻转

判断平衡二叉树

 二叉树层序遍历


这篇主要提供一些关于二叉树例题的讲解,如果对二叉树及其基本操作有疑问的可以转至:

二叉树(上)-CSDN博客
二叉树(中)-CSDN博客

判断树是否相同

力扣链接:100. 相同的树 - 力扣(LeetCode)

题目描述:

给你两棵二叉树的根节点 p 和 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;}

最后存留下来的情况是:值都不为空且值一样,此时就可以继续进行递归来保证两棵树的每一个节点都是一样的。

return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);

完整代码为

//时间复杂度, min(p, q)
class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {//1.先判断结构是否相同if(p != null && q == null || p == null && q != null){return false;}//2.剩下的两种情况为 空或者相等if(p == null && q == null){return true;}//都不为空,判断值是否一样if(p.val != q.val){return false;}//都不为空且值一样return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);}
}

判断树是不是另一棵树的子树

力扣链接:572. 另一棵树的子树 - 力扣(LeetCode)

情况可以大致分为以下三种:

 思路为:

  1. 当前子树和根节点是否一样?
  2. 判断子树是不是和当前root的左子树一样?
  3. 判断子树是不是和当前root的右子树一样?

这里其实也调用了上面写的 判断树是否相同 的代码,

先用 root 和 subRoot(子树) 进行判断树是否相同,然后用root的左子树和右子树同subroot进行递归比较,分别进行比较和返回。

注意:先是比较两棵树是否为子树关系,然后进行递归。

//时间复杂度
//root共有节点r个,subRoot共有节点s个
//时间复杂度为O(r * s)
class Solution {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;}public boolean isSameTree(TreeNode p, TreeNode q) {//1.先判断结构是否相同if(p != null && q == null || p == null && q != null){return false;}//2.剩下的两种情况为 空或者相等if(p == null && q == null){return true;}//都不为空,判断值是否一样if(p.val != q.val){return false;}//都不为空且值一样return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);}}

二叉树翻转

力扣链接:226. 翻转二叉树 - 力扣(LeetCode)

 

 主要思路其实和数据的交换位置是一个类型的,像是下面的代码部分

        TreeNode tmp = root.left;root.left = root.right;root.right = tmp;

然后进行递归,同时加上递归条件和特定情况

class Solution {public TreeNode invertTree(TreeNode root) {if(root == null){return root;}//避免叶子节点再进行if(root.left == null && root.right == null){return null;}TreeNode tmp = root.left;root.left = root.right;root.right = tmp;invertTree(root.left);invertTree(root.right);return root;}
}

判断平衡二叉树

力扣链接:110. 平衡二叉树 - 力扣(LeetCode)

平衡二叉树:如果一棵树是二叉树,那么它的每棵子树都是平衡二叉树。

左右子树高度差 <=1;如果 >=2 则不是平衡二叉树

思路:遍历这棵树的节点,求每个节点的左树和右树的高度,如果发现h >=2,则返回false。

判断整棵树会发现根节点的左子树为平衡二叉树,右子树也是平衡二叉树。

 这里可以先尝试把框架搭建出来:求左子树的高度和右子树的高度,

    public boolean isBalanced(TreeNode root) {if(root == null){return true;}int leftHeight = getHeight(root.left);int rightHeight = getHeight(root.right);return Math.abs(leftHeight - rightHeight) < 2&& isBalanced(root.left) && isBalanced(root.right);}

因为要求每棵树的左右树高,所以我们需写一个额外的方法来进行。

    public int getHeight(TreeNode root){if(root == null){return 0;}int leftTree = getHeight(root.left);int rightTree = getHeight(root.right);return leftTree > rightTree ? leftTree + 1 : rightTree +1;}

完整代码为

//时间复杂度为O(N^2)
class Solution {public boolean isBalanced(TreeNode root) {if(root == null){return true;}int leftHeight = getHeight(root.left);int rightHeight = getHeight(root.right);return Math.abs(leftHeight - rightHeight) < 2&& isBalanced(root.left) && isBalanced(root.right);}public int getHeight(TreeNode root){if(root == null){return 0;}int leftTree = getHeight(root.left);int rightTree = getHeight(root.right);return leftTree > rightTree ? leftTree + 1 : rightTree +1;}
}

 二叉树层序遍历

力扣链接:102. 二叉树的层序遍历 - 力扣(LeetCode)

第一种方法:队列

思路:主要是依靠队列来实现层序遍历,先把头节点设为cur,询问队列时候为空,再去除头节点,并输出,若左右子树不为则分别放入左右子树 

public void levelOrder(TreeNode root){if(root == null){return;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){TreeNode cur = queue.poll();System.out.print(cur.val + " ");if(cur.left != null){queue.offer(cur.left);}if(cur.right != null){queue.offer(cur.right);}}
}

第二种方法:队列 + 二维数组 

也就是力扣链接里的题目,它主要是让我们把每一层的数据放在一起,这里我们可以通过定义一个size变量,来记录每一层数据的个数。

public List<List<Integer>> levelOrder2(TreeNode root) {List<List<Integer>> ret = new ArrayList<>();if (root == null) {return ret;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();List<Integer> list = new ArrayList<>();while (size != 0) {TreeNode cur = queue.poll();list.add(cur.val);//System.out.print(cur.val + " ");if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}size--;}ret.add(list);}return ret;
}

相关文章:

二叉树(下)

目录 判断树是否相同 判断树是不是另一棵树的子树 二叉树翻转 判断平衡二叉树 二叉树层序遍历 这篇主要提供一些关于二叉树例题的讲解&#xff0c;如果对二叉树及其基本操作有疑问的可以转至&#xff1a; 二叉树&#xff08;上&#xff09;-CSDN博客二叉树&#xff08;中&…...

计算机网络33——文件系统

1、chmod 2、chown 需要有root权限 3、link 链接 4、unlink 创建临时文件&#xff0c;用于非正常退出 5、vi vi可以打开文件夹 ../是向外一个文件夹 6、ls ls 可以加很多路径&#xff0c;路径可以是文件夹&#xff0c;也可以是文件 ---------------------------------…...

算法:76.最小覆盖子串

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;滑动窗口&#xff09; 还是老样子&#xff0c;连续问题&#xff0c;滑动窗口哈希表 令t用的hash表为hash1&#xff0c;s用的hash表为hash2 利用hash表统计窗口内的个字符出现的个数&#xff0c;与hash1进行比较 选…...

DNS服务

一.DNS介绍 DNS应用层协议 Domain Name System 域名系统 作用&#xff1a;实现域名解析&#xff0c;解析主机名所对应的IP地址&#xff0c; 在网络环境中设备与设备之间要想相互通信只能依赖IP地址&#xff0c;DNS服务器的作用是实现域名解析。 如上图所示&#xff0c;DNS存…...

STM32 HAL freertos零基础(九)任务通知

1、任务通知 任务通知用于任务之间同步和通信。任务通知允许一个任务向另一个任务发送一个32位的值,并可以选择是否唤醒正在等待通知的任务。这使得任务之间的同步更加简单和灵活。 任务通知功能: 发送通知:一个任务可以向另一个任务发送一个32位的值。 接收通知:接收任…...

Qt+FFmpeg开发视频播放器笔记(三):音视频流解析封装

音频解析 音频解码是指将压缩的音频数据转换为可以再生的PCM(脉冲编码调制)数据的过程。 FFmpeg音频解码的基本步骤如下: 初始化FFmpeg解码器(4.0版本后可省略): 调用av_register_all()初始化编解码器。 调用avcodec_register_all()注册所有编解码器。 打开输入的音频流:…...

从黎巴嫩电子通信设备爆炸看如何防范网络电子袭击

引言&#xff1a; 在当今数字化时代&#xff0c;电子通信设备已成为我们日常生活中不可或缺的一部分。然而&#xff0c;近期黎巴嫩发生的电子设备爆炸事件提醒我们&#xff0c;这些设备也可能成为危险的武器。本文将深入探讨电子袭击的原理、防范措施&#xff0c;以及网络智能…...

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL16

使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器 描述 ②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。 可将优先编码器Ⅰ的代码添加到本题答案中&#xff0c;并例化。 优先编码器Ⅰ的代码如下&#xff1a; module…...

12 - TCPServer实验

在上一章节中&#xff0c;我们学习了TCPClient通信测试的相关知识。接下来&#xff0c;本章节将以此为基础&#xff0c;构建一个基础性的TCPServer连接机制&#xff0c;该机制将利用之前所建立的WIFI网络连接。为方便演示&#xff0c;我们将借助网络调试助手工具进行数据的发送…...

Explain执行计划

Explain执行计划 explain可以帮助开发人员分析SQL问题&#xff0c;explain用于显示MySQL如何使用SQL执行计划&#xff0c;可以帮助开发人员写出更优化的查询语句。使用方法就是在查询语句前加上explain关键字。 执行添加上explain关键字的语句可以看到一个列表&#xff1a; 其…...

ARM/Linux嵌入式面经(三六):中科曙光

文章目录 1.AD转换,怎么在项目中运用2.项目中的通信网络介绍一下通信网络介绍1. 通信网络类型2. 通信网络特点3. 应用场景4. 关键技术5. 项目中的具体应用和实现方式模拟面试官追问3.socketSocket介绍深度拓展与追问深度拓展可能的追问4.进程间通信方式进程间通信方式介绍总结…...

Python和C++气候模型算法模型气候学模拟和统计学数据可视化及指标评估

&#x1f3af;要点 贝叶斯推理气候模型辐射对流及干湿能量平衡模型时间空间气象变化预测模型评估统计指标气象预测数据变换天气和气象变化长短期影响预估降低气候信息尺度评估算法气象行为模拟&#xff1a;碳循环、辐射强迫和温度响应温室气体排放碳循环温室诱导气候变化评估气…...

鸿蒙开发城市联动选择弹框

鸿蒙开发城市联动选择弹框 城市联动选择弹框不容易&#xff0c;在Android那边也是不容易。选择某个省份时&#xff0c;城市要对得上&#xff0c;切换得及时 一、思路&#xff1a; 关键用Provide和Consume互相监听对方的变化 二、效果图&#xff1a; 三、视频效果&#xff1…...

css 控制虚线刻度尺寸

文章目录 css效果 css <div style"width: 100%; height: 1px;background-image: linear-gradient(to right, #545454 0%, #545454 80%, transparent 5%);background-size: 15px 10px;background-repeat: repeat-x; margin: 0 auto;"></div>效果...

NLP三天入门大模型,我领先你好几个版本了

大模型时代下&#xff0c;nlp初学者需要怎么入门? 入门姿势简单粗暴:打一些必要的基础就跑步进入Transformera 大模型时代&#xff0c;传统的算法&#xff0c;像分词、词性标注&#xff0c;被替代得非常厉害&#xff0c;在入门阶段没必要花费太多精力在传统算法上面。 数学和…...

专题六_模拟_算法详细总结

目录 模拟算法 1.模拟算法流程&#xff08;一定要在草稿纸上演算一遍流程&#xff09; 2.把流程转换成代码 1. 替换所有的问号&#xff08;easy&#xff09; 解析&#xff1a; 1.暴力&#xff1a; 2.优化&#xff1a;&#xff08;找规律&#xff09; 总结&#xff1a; …...

ArrayList的扩容机制

ArrayList的扩容机制 ArrayList中的成员变量&#xff1a;1.不带参数的构造方法 让elementDate 引用指向 DEFAULTCAPACITY_EMPTY_ELEMENTDATA所指向的对象 > 当我们调用 不带参数的构造方法的时候 第一次进行add元素的时候&#xff0c;会为底层的数组 进行内存的分配&…...

一、编译原理(引论)

目录 【一】、引论 一、编译器 1、编译器 2、编译器与解释器 3、编译器结构 【一】、引论 一、编译器 1、编译器 &#xff08;1&#xff09;编译器&#xff1a;将人类易懂的 高级语言 翻译成 硬件可执行的目标机器语言 &#xff08;2&#xff09; 高级语言 ⚫ 直接面…...

【Javascript修炼篇】JS中的函数式编程

介绍&#xff1a; 函数式编程&#xff08;FP&#xff09;是一种编程范式&#xff0c;这意味着一种基于一些原则来思考软件构建的方法&#xff0c;比如 纯函数、不可变性、一等与高阶函数、函数组合、闭包、声明式编程、递归、引用透明性、柯里化 和 部分应用。 当这些原则有效…...

spring cxf 常用注解

在Spring框架中&#xff0c;特别是当与Apache CXF&#xff08;一个流行的SOAP和RESTful Web服务框架&#xff09;结合使用时&#xff0c;我们会遇到一系列的注解。以下是一些在Spring和CXF中常用的注解&#xff1a; Spring相关注解&#xff1a; Component&#xff1a;用于定义一…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...