当前位置: 首页 > 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文件。 自动触发…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...