相同的树及延伸题型(C语言详解版)
从LeetCode 100和101看二叉树的比较与对称性判断
今天要讲的是leetcode100.相同的树,并且本文章还会讲到延伸题型leetcode101.对称二叉树。本文章编写用的是C语言,大家主要是学习思路,学习过后可以自己点击链接测试,并且做一些对应的生题,现在就让我们开始吧!
一、题目简介
LeetCode 100:相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:

输入:p = [1,2,3], q = [1,2,3] 输出:true
示例 2:

输入:p = [1,2], q = [1,null,2] 输出:false
示例 3:

输入:p = [1,2,1], q = [1,1,2] 输出:false
提示:
- 两棵树上的节点数目都在范围
[0, 100]内 -104 <= Node.val <= 104
LeetCode 101: 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:

输入:root = [1,2,2,3,4,4,3] 输出:true
示例 2:

输入:root = [1,2,2,null,3,null,3] 输出:false
提示:
- 树中节点数目在范围
[1, 1000]内 -100 <= Node.val <= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
二、思路详解
题目一:LeetCode 100(相同的树)
1. 问题分析
这道题里有一个小坑,如果我们单纯只通过遍历来比对是否相等的话,是无法保证二叉树的结构相同的,仅仅只能保证该颗二叉树所包含的节点数值是一致的,但是我们将一颗树分为多个部分来比对就会方便很多,将两棵树对应的左子树与左子树比对,右子树和右子树比对。
2. 解题思路
我们可以使用递归的方法来解决这个问题。递归的基本思路如下:
-
如果两个节点都为空,返回
true。 -
如果一个节点为空而另一个不为空,返回
false。 -
如果两个节点的值不同,返回
false。 -
递归地比较左子树和右子树。
3. C语言实现
#include <stdbool.h>// 定义二叉树节点结构
typedef struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;
} TreeNode;// 递归函数,比较两个节点
bool isSameTree(TreeNode* p, TreeNode* q) {// 如果两个节点都为空,返回trueif (p == NULL && q == NULL) {return true;}// 如果一个为空,另一个不为空,返回falseif (p == NULL || q == NULL) {return false;}// 如果两个节点的值不同,返回falseif (p->val != q->val) {return false;}// 递归比较左子树和右子树return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
题目二:LeetCode 101(对称二叉树)
1. 问题分析
这道题与上一道题(LeetCode 100:相同的树)是很相似,但有两个关键的不同点:
-
参数不同:这道题只传入一个根节点,即只有一棵树。
-
判断条件不同:这道题要求判断的是对称二叉树,即镜像相同。具体来说,左子树的左节点应该与右子树的右节点相同,左子树的右节点应该与右子树的左节点相同。
2. 解题思路
为了解决上述两个不同点,我们可以通过构造一个新的函数来实现将一棵树“一分为二”,再对两侧的左右子树进行比较。递归的基本思路如下:
-
递归终止条件:
-
如果两个节点都为空,返回
true,表示这部分是镜像对称的。 -
如果一个节点为空而另一个不为空,返回
false,表示这部分不对称。
-
-
递归逻辑:
-
如果两个节点的值相同,继续递归比较左子树的左节点与右子树的右节点,以及左子树的右节点与右子树的左节点。
-
如果两个节点的值不同,直接返回
false。
-
3. C语言实现
#include <stdbool.h>// 定义二叉树节点结构
typedef struct TreeNode {int val; // 节点的值struct TreeNode *left; // 指向左子节点的指针struct TreeNode *right; // 指向右子节点的指针
} TreeNode;// 辅助函数:检查两个节点是否镜像对称
bool check(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 check(p->left, q->right) && check(p->right, q->left);}// 如果两个节点的值不同,直接返回falsereturn false;
}// 主函数:判断整棵树是否对称
bool isSymmetric(struct TreeNode* root) {// 从根节点开始,调用辅助函数检查整棵树是否对称return check(root, root);
}
4.迭代法(拓展)
为了判断一棵二叉树是否对称,我们还可以使用层次遍历(BFS)。由于二叉树的结构特性,我们无法直接通过自身的遍历来实现层次遍历,因此需要借助一个辅助数据结构——队列。队列可以帮助我们逐层比较左右子树的节点,确保对称性。
#include <stdbool.h>// 定义二叉树节点结构
typedef struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;
} TreeNode;// 使用迭代方法(层次遍历)判断二叉树是否对称
bool isSymmetric(struct TreeNode* root) {// 如果根节点为空,直接返回 true(空树是对称的)if (root == NULL) return true;// 使用数组模拟队列struct TreeNode* queue[1000];// head 和 tail 分别指向队列的头部和尾部int head = 0, tail = 0;// 将根节点的左右子树加入队列queue[tail++] = root->left;queue[tail++] = root->right;// 循环结束条件:队列为空(head == tail)while (head != tail) {// 从队列中取出两个节点进行比较struct TreeNode* leftNode = queue[head++];struct TreeNode* rightNode = queue[head++];// 如果一个节点为空而另一个不为空,说明不对称,返回 falseif (leftNode == NULL && rightNode != NULL) return false;if (leftNode != NULL && rightNode == NULL) return false;// 如果两个节点都为空,跳过本轮循环,继续下一对节点的比较if (leftNode == NULL && rightNode == NULL) continue;// 如果两个节点的值不相等,说明不对称,返回 falseif (leftNode->val != rightNode->val) return false;// 将左节点的左子节点和右节点的右子节点加入队列queue[tail++] = leftNode->left;queue[tail++] = rightNode->right;// 将左节点的右子节点和右节点的左子节点加入队列queue[tail++] = leftNode->right;queue[tail++] = rightNode->left;}// 如果队列为空且没有发现不对称的情况,返回 truereturn true;
} 好啦,今天的leetcode每日一题就到这里啦,欢迎大家点赞收藏,一起进步,我们明天见!
相关文章:
相同的树及延伸题型(C语言详解版)
从LeetCode 100和101看二叉树的比较与对称性判断 今天要讲的是leetcode100.相同的树,并且本文章还会讲到延伸题型leetcode101.对称二叉树。本文章编写用的是C语言,大家主要是学习思路,学习过后可以自己点击链接测试,并且做一些对…...
【Redis】 String 类型的介绍和常用命令
1. 介绍 Redis 中的 key 都是字符串类型Redis 中存储字符串是完全按照二进制流的形式保存的,所以 Redis 是不处理字符集编码的问题,客户端传入的命令中使用的是什么编码就采用什么编码,使得 Redis 能够处理各种类型的数据,包括文…...
LLM - 大模型 ScallingLaws 的设计 100B 预训练方案(PLM) 教程(5)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145356022 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scaling Laws (缩放法则) 是大模型领域中,用于描述 模型性能(Loss) 与…...
Docker/K8S
文章目录 项目地址一、Docker1.1 创建一个Node服务image1.2 volume1.3 网络1.4 docker compose 二、K8S2.1 集群组成2.2 Pod1. 如何使用Pod(1) 运行一个pod(2) 运行多个pod 2.3 pod的生命周期2.4 pod中的容器1. 容器的生命周期2. 生命周期的回调3. 容器重启策略4. 自定义容器启…...
32、【OS】【Nuttx】OSTest分析(1):stdio测试(二)
背景 接上篇wiki 31、【OS】【Nuttx】OSTest分析(1):stdio测试(一) 继续stdio测试的分析,上篇讲到标准IO端口初始化,单从测试内容来说其实很简单,没啥可分析的,但这几篇…...
git push到远程仓库时无法推送大文件
一、错误 remote: Error: Deny by project hooks setting ‘default’: size of the file ‘scientific_calculator’, is 164 MiB, which has exceeded the limited size (100 MiB) in commit ‘4c91b7e3a04b8034892414d649860bf12416b614’. 二、原因 本地提交过大文件&am…...
Vue.js路由管理与自定义指令深度剖析
Vue.js 是一个强大的前端框架,提供了丰富的功能来帮助开发者构建复杂的单页应用(SPA)。本文将详细介绍 Vue.js 中的自定义指令和路由管理及导航守卫。通过这些功能,你可以更好地控制视图行为和应用导航,从而提升用户体验和开发效率。 1 自定义指令详解 1.1 什么是自定义…...
NVIDIA GPU介绍:概念、序列、核心、A100、H100
概述 入职一家大模型领域创业公司,恶补相关知识。 概念 一些概念: HPC:High Performance Computing,高性能计算SoC:System on Chip,单片系统FLOPS:Floating Point Operations Per Second&am…...
【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂
目录 1. 常见运算函数 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…...
C语言练习(31)
有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。 设5名学生的学号、姓名和3门课程成绩如下&am…...
什么是长短期记忆网络?
一、概念 长短期记忆网络(Long Short-Term Memory, LSTM)是一种特殊的循环神经网络(RNN),旨在解决标准RNN在处理长序列时的梯度消失和梯度爆炸问题。LSTM通过引入三个门(输入门、遗忘门和输出门)…...
git中有关old mode 100644、new mode 10075的问题解决小结
在 Git 版本控制系统中,文件权限变更是一种常见情况。当你看到类似 old mode 100644 和 new mode 100755 的信息时,这通常表示文件的权限发生了变化。本文将详细解析这种情况,并提供解决方法和注意事项。 问题背景 在 Git 中,文…...
Jenkins上生成的allure report打不开怎么处理
目录 问题背景: 原因: 解决方案: Jenkins上修改配置 通过Groovy脚本在Script Console中设置和修改系统属性 步骤 验证是否清空成功 进一步的定制 也可以使用Nginx去解决 使用逆向代理服务器Nginx: 通过合理调整CSP配置&a…...
JSR303校验教学
1、什么是JSR303校验 JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。…...
使用DeepSeek技巧:提升内容创作效率与质量
一、引言 在当今快节奏的数字时代,内容创作的需求不断增加,无论是企业营销、个人博客还是学术研究,高效且高质量的内容生成变得至关重要。DeepSeek作为一款先进的人工智能写作助手,凭借其强大的语言生成能力,为创作者…...
【第六天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-一种常见的贪心算法(持续更新)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Python数据结构与算法的详细介绍1.Python中的常用的贪心算法2.贪心算法3.详细的贪心代码1)一种常见的贪心算法 总结 前言 提示:这里…...
C# Winform制作一个登录系统
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…...
算法总结-哈希表
文章目录 1.赎金信1.答案2.思路 2.字母异位词分组1.答案2.思路 3.两数之和1.答案2.思路 4.快乐数1.答案2.思路 5.最长连续序列1.答案2.思路 1.赎金信 1.答案 package com.sunxiansheng.arithmetic.day14;/*** Description: 383. 赎金信** Author sun* Create 2025/1/22 11:10…...
向下调整算法(详解)c++
算法流程: 与⽗结点的权值作⽐较,如果⽐它⼤,就与⽗亲交换; 交换完之后,重复 1 操作,直到⽐⽗亲⼩,或者换到根节点的位置 大家可能会有点疑惑,这个是大根堆,22是怎么跑到…...
蓝桥杯之c++入门(一)【C++入门】
目录 前言5. 算术操作符5.1 算术操作符5.2 浮点数的除法5.3 负数取模5.4 数值溢出5.5 练习练习1:计算 ( a b ) ⋆ c (ab)^{\star}c (ab)⋆c练习2:带余除法练习3:整数个位练习4:整数十位练习5:时间转换练习6ÿ…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
