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

【OJ】二叉树相关OJ题

✨✨欢迎大家来到Celia的博客✨✨

🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉

所属专栏:OJ题

个人主页:Celia's blog~

目录

​编辑

单值二叉树

题目描述  OJ-单值二叉树

解题思路

代码实现

二叉树的最大深度

题目描述  OJ-二叉树的最大深度

解题思路

代码实现

检查两棵树是否相同

题目描述 OJ-相同的树

解题思路

代码实现

对称二叉树 

题目描述   OJ-对称二叉树

解题思路

代码实现

另一颗树的子树

题目描述 OJ-另一颗树的子树

解题思路

代码实现

翻转二叉树

题目描述 OJ-翻转二叉树

解题思路

代码实现

平衡二叉树

题目描述 OJ-平衡二叉树

解题思路

代码实现

单值二叉树

  • 题目描述  OJ-单值二叉树

  • 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
  • 只有给定的树是单值二叉树时,才返回 true;否则返回 false

  • 解题思路

本题的核心是判断左右子树的val的值是否和主干的val相等。

  1. 若节点为空,则返回true。
  2. 若不相等,返回false。
  3. 如果这两个条件都不满足,则递归判断左右子树。

该题调用的函数参数只有一个二叉树节点指针。为了方便起见,可以额外写一个子函数来进行递归,子函数的参数为二叉树节点指针root和该节点的值val

返回true的情况示例
​​​​​(​​绿色数字为执行顺序)
返回false的情况示例
​​​​​(​​绿色数字执行顺序)
  • 代码实现

bool _isUnivalTree(struct TreeNode* root,int val)
{if(root == NULL)return true;if(root->val != val)return false;return _isUnivalTree(root->left,val) && _isUnivalTree(root->right,val);
}
bool isUnivalTree(struct TreeNode* root)//系统调用的函数
{return _isUnivalTree(root,root->val);
}

二叉树的最大深度

  • 题目描述  OJ-二叉树的最大深度

  • 给定一个二叉树 root ,返回其最大深度。
  • 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

  • 解题思路

本题的关键在于,该树的深度为左右子树中最大的深度

  1. 如果传入的节点为空,则返回0。
  2. 如果节点不为空,则递归计算左右两个子树的深度,并且定义两个整型变量记录下来
  3. 最后返回左右子树深度中值最大的一个。
递归遍历求深度示例
(​​绿色数字执行顺序)
  • 代码实现

int maxDepth(struct TreeNode* root) {if(root == NULL)return 0;int l = maxDepth(root->left);int r = maxDepth(root->right);return l > r ? l + 1 :r + 1;
}

在这里要注意一定要用两个变量接收左右子树的深度,不可以将递归函数写在三目运算符中:

return maxDepth(root->left) > maxDepth(root->right) ? maxDepth(root->left) + 1 : rmaxDepth(root->right) + 1;

上面的写法会导致过多的重复运算,严重拖慢了运行时间。 

检查两棵树是否相同

  • 题目描述 OJ-相同的树

  • 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
  • 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

  • 解题思路

  1. 如果传入的节点都为空,则返回true。
  2. 如果只有其中一个为空,另一个不为空,则返回false。
  3. 如果传入的节点都不为空,但是这两颗树当前节点值不同,返回false。
  4. 递归遍历两个左右子树,左子树和左子树比较,右子树和右子树比较,返回两个递归逻辑与的结果。
  • 代码实现

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{if(p == NULL && q == NULL)return true;if(p == NULL || q == NULL)return false;if(p->val != q->val)return false;return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

对称二叉树 

  • 题目描述   OJ-对称二叉树

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

  • 解题思路

这道题和  OJ-相同的树 思路是一样的,唯一需要改变的地方为相同的树是相同方向的树进行比较,而本题是不同方向的树进行比较。

  • 代码实现

bool _isSymmetric(struct TreeNode* r1,struct TreeNode* r2)
{if(r1 == NULL && r2 == NULL)return true;if(r1 == NULL || r2 == NULL)return false;if(r1->val != r2->val)return false;return _isSymmetric(r1->right,r2->left) && _isSymmetric(r1->left,r2->right);
}
bool isSymmetric(struct TreeNode* root)
{return _isSymmetric(root->left,root->right);
}

另一颗树的子树

  • 题目描述 OJ-另一颗树的子树

  • 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
  • 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

  • 解题思路

  1. 本题提供的subRoot树一定为非空,那么如果传入的root节点为空,则一定不包含子树,返回false。
  2. 先判断subRoot树和root树的当前节点的值是否相同,若相同,检查以当前节点为根节点的树是否为subRoot树,如果是,返回true。
  3. 以左右子树为根节点递归左右子树,返回它们逻辑或的结果。(左右只要含有子树就符合题意)
  • 代码实现

本题用到了  OJ-相同的树 的代码。

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{if(p == NULL && q == NULL)return true;if(p == NULL || q == NULL)return false;if(p->val != q->val)return false;return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{if(root == NULL)return false;if(root->val == subRoot->val && isSameTree(root,subRoot))return true;return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);}

翻转二叉树

  • 题目描述 OJ-翻转二叉树

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

  • 解题思路

  1. 如果传入的节点为空,返回NULL。
  2. 如果传入的节点非空,则交换左右子树节点的值。
  3. 递归调用左右子树。
  4. 返回根节点。
  • 代码实现

struct TreeNode* invertTree(struct TreeNode* root)
{if(root == NULL)return NULL;struct TreeNode* tmp = root->right;root->right = root->left;root->left = tmp;invertTree(root->left);invertTree(root->right);return root; 
}

平衡二叉树

  • 题目描述 OJ-平衡二叉树

  • 给定一个二叉树,判断它是否是 平衡二叉树。
  • 平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。

  • 解题思路

  1. 如果传入的节点为空,返回true。
  2. 定义两个变量,记录当前节点的左右子树的深度,并求出左右子树相差的绝对值。
  3. 若绝对值大于1,返回false。
  4. 递归调用左右子树,返回它们逻辑与的结果(左右两边都必须平衡)。
  • 代码实现

本题用到了  OJ-二叉树的最大深度 的代码。

int TreeHeight(struct TreeNode* root)
{if(root == NULL)return 0;int r = TreeHeight(root->left);int r1 = TreeHeight(root->right);return r1 > r ? r1 + 1 : r + 1;
}
bool isBalanced(struct TreeNode* root)
{if(root == NULL)return true;int leftHeight = TreeHeight(root->left);int rightHeight = TreeHeight(root->right);int size = abs(leftHeight - rightHeight);//求绝对值if(size > 1)return false;return isBalanced(root->left) && isBalanced(root->right);
}

相关文章:

【OJ】二叉树相关OJ题

✨✨欢迎大家来到Celia的博客✨✨ 🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉 所属专栏:OJ题 个人主页:Celias blog~ 目录 ​编辑 单值二叉树 题目描述 OJ-单值二叉树 解题思路 …...

Blender中保存透明图片

在Blender中保存透明图片,主要是通过在渲染设置中调整背景透明度,并选择合适的文件格式来保存图像。以下是一个详细的步骤指南: 一、设置渲染属性 打开Blender并加载你想要渲染的模型。在右侧的属性编辑器中,找到并点击“渲染属…...

MySQL之索引优化

1、在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引 例如下面的查询不能使用 actor_id 列的索引: #这是错误的 SELECT actor_id FROM sakila.actor WHERE actor_id 1 5; 优化方式:…...

Spring Boot 与 Amazon S3:快速上传与下载文件的完整指南

概要 在将 Spring Boot 更新到 3 系列时,由于 javax 需要被替换为 jakarta,因此原先依赖于 javax 的 spring-cloud-starter-aws1 将无法使用(虽然在我本地环境中仍然可以正常工作)。为了确保兼容性,我将依赖关系更改为…...

细节剖析:HTTP与HTTPS在安全性、性能等方面的不同!

HTTPS是现代互联网通信的重要基石,通过加密通信、身份验证和数据完整性保护,为数十亿用户提供了安全可靠的互联网体验。 小编整理了2GB程序员相关资料,关注微信公众号“程序员Style”回复“程序员”免费领取! 1、介绍 随着 HTT…...

MySQL面试篇章——MySQL索引

文章目录 MySQL 索引索引分类索引创建和删除索引的执行过程explain 查看执行计划explain 结果字段分析 索引的底层实现原理B-树B树哈希索引 聚集和非聚集索引MyISAM(\*.MYD,*.MYI)主键索引辅助索引(二级索引) InnoDB&a…...

WSL 2 Oracle Linux 9.1 安装配置

文章目录 环境使用体验安装 Oracle Linux 9.1修改默认存储路径默认 root 用户登录启用 systemd启用 SSH 连接WSL 无法 ping 通宿主机和域名WSL 使用主机代理(测试通过)WSL 常用命令 环境 OS:Win11 24H2 (OS 内部版本26120.1252) wsl --versio…...

MySQL日志文件详解

MySQL中的日志文件是MySQL数据库系统的重要组成部分,它们记录了数据库的运行情况、用户操作、错误信息等,对于数据库的维护、优化、故障排查和恢复都具有重要意义。以下是MySQL中几种主要日志文件的详解: 1. 二进制日志(Binary L…...

MySQL零散拾遗(三)

在mysql中,JOIN ON 和 WHERE 的作用和用法是怎么样的? 在MySQL中,JOIN语句用于将两个或多个表根据指定的关联条件合并成一个新的结果集。JOIN ON和WHERE子句在JOIN语句中扮演着不同的角色,它们的用法和作用如下: JOI…...

鸿蒙 使用 Refresh 实现下拉刷新

import promptAction from ohos.promptActionEntry Component struct Index {Staterefreshing: boolean falseStatelist: number[] Array(20).fill(Date.now())Buildercontent(){Stack(){Row(){LoadingProgress().height(32)Text(正在刷新...).fontSize(16).margin({left:20}…...

【JavaScript 算法】图的遍历:理解图的结构

🔥 个人主页:空白诗 文章目录 一、深度优先搜索(DFS)深度优先搜索的步骤深度优先搜索的JavaScript实现 二、广度优先搜索(BFS)广度优先搜索的步骤 三、应用场景四、总结 图的遍历是图论中的基本操作之一&am…...

Ubuntu 中默认的 root 用户密码

场景:想要切换root用户,发现得输入密码,以为是以前设置过然后一直尝试都是错误【认证失败】最后发现根本没设置过root用户,默认会随机生成root用户的密码😅 Ubuntu 中默认的 root 密码是随机的,即每次开机都…...

Rust编程-高级特性

unsafe:内存不安全 内存安全问题,例如空指针解引用 关键字unsafe来切换到不安全模式,并在被标记后的代码块中使用不安全代码 使用unsafe告诉编译器后面代码安全性自行负责 因为电脑硬件安全问题,必须编写可能不安全的代码 可以将…...

JavaRegexImprove练习(1) (2024.7.22)

ImproveExercise1 package RegexImprove20240722; import java.util.Scanner; public class ImproveExercise {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串");String str sc.nextLine();//…...

基于YOLO模型的鸟类识别系统

鸟类识别在生物研究和保护中具有重要意义。本文将详细介绍如何使用YOLO(You Only Look Once)模型构建一个鸟类识别系统,包括UI界面、YOLOv8/v7/v6/v5代码以及训练数据集。 目录 2. 环境配置 2.1 安装Python和相关库 2.2 安装YOLO模型库 …...

WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)

文章目录 1.媒体协商SDP简介 2.网络协商STUN的工作原理TURN工作原理 3.信令服务器信令服务器的主要功能信令服务器的实现方式 1.媒体协商 比如下面这个例子 A端与B端要想通信 A端视频采用VP8做解码,然后发送给B端,B端怎么解码? B端视频采用…...

面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux

1. 如果系统的 QPS 突然提升 10 倍该怎么设计? 1.1 硬件的扩展微服务的拆分 如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起,当流量一旦起来之后,单体架构的问题就暴露出来了,机器挂了所有的业务就全部无法…...

【数学建模】——前沿图与网络模型:新时代算法解析与应用

目录 1.图与网络的基本概念 1. 无向图和有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与图的连通性 2.图的矩阵表示 1. 关联矩阵 2. 邻接矩阵 3.最短路问题 1.Dijkstra 算法 2.Floyd 算法 4.最小生成树问题 1.Kruskal 算法 2.Prim 算法 5.着色问题 6.…...

视频分帧【截取图片】(YOLO目标检测【生成数据集】)

高效率制作数据集【按这个流程走,速度很顶】 本次制作,1059张图片【马路上流动车辆】 几乎就是全自动了,只要视频拍得好,YOLO辅助制作数据集就效率极高 视频中的图片抽取: 【由于视频内存过大,遇到报错执行…...

Redis7(二)Redis持久化双雄

持久化之RDB RDB的持久化方式是在指定时间间隔,执行数据集的时间点快照。也就是在指定的时间间隔将内存中的数据集快照写入磁盘,也就是Snapshot内存快照,它恢复时再将硬盘快照文件直接读回到内存里面。 RDB保存的是dump.rdb文件。 自动触发…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...