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

相同的树及延伸题型(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:相同的树)是很相似,但有两个关键的不同点:

  1. 参数不同:这道题只传入一个根节点,即只有一棵树。

  2. 判断条件不同:这道题要求判断的是对称二叉树,即镜像相同。具体来说,左子树的左节点应该与右子树的右节点相同,左子树的右节点应该与右子树的左节点相同。

2. 解题思路

为了解决上述两个不同点,我们可以通过构造一个新的函数来实现将一棵树“一分为二”,再对两侧的左右子树进行比较。递归的基本思路如下:

  1. 递归终止条件

    • 如果两个节点都为空,返回 true,表示这部分是镜像对称的。

    • 如果一个节点为空而另一个不为空,返回 false,表示这部分不对称。

  2. 递归逻辑

    • 如果两个节点的值相同,继续递归比较左子树的左节点与右子树的右节点,以及左子树的右节点与右子树的左节点。

    • 如果两个节点的值不同,直接返回 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.相同的树&#xff0c;并且本文章还会讲到延伸题型leetcode101.对称二叉树。本文章编写用的是C语言&#xff0c;大家主要是学习思路&#xff0c;学习过后可以自己点击链接测试&#xff0c;并且做一些对…...

【Redis】 String 类型的介绍和常用命令

1. 介绍 Redis 中的 key 都是字符串类型Redis 中存储字符串是完全按照二进制流的形式保存的&#xff0c;所以 Redis 是不处理字符集编码的问题&#xff0c;客户端传入的命令中使用的是什么编码就采用什么编码&#xff0c;使得 Redis 能够处理各种类型的数据&#xff0c;包括文…...

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分析&#xff08;1&#xff09;&#xff1a;stdio测试&#xff08;一&#xff09; 继续stdio测试的分析&#xff0c;上篇讲到标准IO端口初始化&#xff0c;单从测试内容来说其实很简单&#xff0c;没啥可分析的&#xff0c;但这几篇…...

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

概述 入职一家大模型领域创业公司&#xff0c;恶补相关知识。 概念 一些概念&#xff1a; HPC&#xff1a;High Performance Computing&#xff0c;高性能计算SoC&#xff1a;System on Chip&#xff0c;单片系统FLOPS&#xff1a;Floating Point Operations Per Second&am…...

【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂

目录 1. 常见运算函数 个人主页&#xff1a;Icomi 专栏地址&#xff1a;PyTorch入门 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…...

C语言练习(31)

有5个学生&#xff0c;每个学生有3门课程的成绩&#xff0c;从键盘输入以上数据&#xff08;包括学号、姓名、3门课程成绩&#xff09;&#xff0c;计算出平均成绩&#xff0c;将原有数据和计算出的平均分数存放在磁盘文件stud中。 设5名学生的学号、姓名和3门课程成绩如下&am…...

什么是长短期记忆网络?

一、概念 长短期记忆网络&#xff08;Long Short-Term Memory, LSTM&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;旨在解决标准RNN在处理长序列时的梯度消失和梯度爆炸问题。LSTM通过引入三个门&#xff08;输入门、遗忘门和输出门&#xff09…...

git中有关old mode 100644、new mode 10075的问题解决小结

在 Git 版本控制系统中&#xff0c;文件权限变更是一种常见情况。当你看到类似 old mode 100644 和 new mode 100755 的信息时&#xff0c;这通常表示文件的权限发生了变化。本文将详细解析这种情况&#xff0c;并提供解决方法和注意事项。 问题背景 在 Git 中&#xff0c;文…...

Jenkins上生成的allure report打不开怎么处理

目录 问题背景&#xff1a; 原因&#xff1a; 解决方案&#xff1a; Jenkins上修改配置 通过Groovy脚本在Script Console中设置和修改系统属性 步骤 验证是否清空成功 进一步的定制 也可以使用Nginx去解决 使用逆向代理服务器Nginx&#xff1a; 通过合理调整CSP配置&a…...

JSR303校验教学

1、什么是JSR303校验 JSR是Java Specification Requests的缩写&#xff0c;意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR&#xff0c;以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。…...

使用DeepSeek技巧:提升内容创作效率与质量

一、引言 在当今快节奏的数字时代&#xff0c;内容创作的需求不断增加&#xff0c;无论是企业营销、个人博客还是学术研究&#xff0c;高效且高质量的内容生成变得至关重要。DeepSeek作为一款先进的人工智能写作助手&#xff0c;凭借其强大的语言生成能力&#xff0c;为创作者…...

【第六天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-一种常见的贪心算法(持续更新)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Python数据结构与算法的详细介绍1.Python中的常用的贪心算法2.贪心算法3.详细的贪心代码1&#xff09;一种常见的贪心算法 总结 前言 提示&#xff1a;这里…...

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++

算法流程&#xff1a; 与⽗结点的权值作⽐较&#xff0c;如果⽐它⼤&#xff0c;就与⽗亲交换&#xff1b; 交换完之后&#xff0c;重复 1 操作&#xff0c;直到⽐⽗亲⼩&#xff0c;或者换到根节点的位置 大家可能会有点疑惑&#xff0c;这个是大根堆&#xff0c;22是怎么跑到…...

蓝桥杯之c++入门(一)【C++入门】

目录 前言5. 算术操作符5.1 算术操作符5.2 浮点数的除法5.3 负数取模5.4 数值溢出5.5 练习练习1&#xff1a;计算 ( a b ) ⋆ c (ab)^{\star}c (ab)⋆c练习2&#xff1a;带余除法练习3&#xff1a;整数个位练习4&#xff1a;整数十位练习5&#xff1a;时间转换练习6&#xff…...

AI驱动的工业预测性维护技术实践:AI驱动的预测性维护系统通过多传感器融合(振动、温度、电流等)实时监测设备健康状态,结合TSN网络实现毫秒级数据传输

标签:预测性维护 PHM 工业AI 振动分析 TSN 设备管理 引言:设备算命先生的时代来了 “老张,你这台风机轴承怕是撑不过两周了。” 如果有个"设备算命先生"能掐指一算就说出这句话,工厂的设备经理们大概会把他供起来。但在2024年,这个"算命先生"真的出…...

利用CircuitPython内置传感器实现CPU温度监控与本地日志记录

1. 项目概述&#xff1a;从芯片温度到数据洞察 在嵌入式项目里&#xff0c;给设备“把脉”是基本功。CPU温度&#xff0c;这个看似简单的数据点&#xff0c;其实是窥探硬件运行状态的绝佳窗口。它不仅能告诉你芯片是不是在“发烧”&#xff0c;更能间接反映环境变化、负载情况&…...

如何快速掌握音频频谱分析:Spek开源工具完整指南

如何快速掌握音频频谱分析&#xff1a;Spek开源工具完整指南 【免费下载链接】spek Acoustic spectrum analyser 项目地址: https://gitcode.com/gh_mirrors/sp/spek 想要深入了解音频文件的内部结构吗&#xff1f;Spek音频频谱分析器是你的理想选择&#xff01;这款免费…...

给嵌入式工程师的保姆级ISP图像调试指南:从AE曝光到3DNR降噪的完整流程

嵌入式工程师的ISP图像调试实战手册&#xff1a;从曝光控制到降噪优化的全链路解析 当你第一次拿到一款全新的IPC摄像头模组时&#xff0c;是否曾被复杂的ISP参数搞得手足无措&#xff1f;作为嵌入式工程师&#xff0c;我们往往需要在资源受限的环境中实现专业级的图像质量。本…...

别熬大夜改 PPT 了!Paperxie AI PPT,一键搞定毕业论文答辩

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 论文终稿刚定稿&#xff0c;答辩 PPT 的空白页面就开始让人焦虑。打开 PowerPoint&#xff0c;对着 “新建幻灯片” 发愣&am…...

用GitHub仓库构建个人技能树:结构化、版本化知识管理实践

1. 项目概述&#xff1a;从“技能”仓库到个人知识体系的构建最近在GitHub上看到一个挺有意思的仓库&#xff0c;名字叫Apolinariolanga/skills。乍一看&#xff0c;这名字很直白——“技能”。在技术社区里&#xff0c;以“skills”命名的仓库并不少见&#xff0c;但每一个背后…...

GPT模型评估实战:开源工具gpt-stats构建多维度能力评测体系

1. 项目概述&#xff1a;一个为GPT模型“体检”的开源利器如果你和我一样&#xff0c;日常工作中经常和各类GPT模型打交道&#xff0c;无论是调用OpenAI的官方API&#xff0c;还是部署、微调开源的Llama、Qwen等模型&#xff0c;心里总会萦绕着一个问题&#xff1a;这个模型到底…...

Ubuntu history 命令实用教程(设置记录命令行数或永久记录等)

Ubuntu history 命令实用教程简介一、认识 history 是什么二、查看本机当前历史配置1. 查看当前历史条数限制2. 查看历史文件实际已有多少条记录三、手动设置 history 指定记录行数1. 编辑配置文件2. 写入指定行数配置3. 保存退出并生效四、设置 history 永久不删除&#xff08…...

DeepSeek Ansible剧本调试黑洞破解:1行debug命令+4个隐藏日志开关,5分钟定位playbook卡死根源

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek Ansible剧本调试黑洞破解&#xff1a;1行debug命令4个隐藏日志开关&#xff0c;5分钟定位playbook卡死根源 当 DeepSeek 定制的 Ansible playbook 在执行中突然“静默卡死”——无报错、无超时…...

开源学习追踪工具:从数据模型到全栈部署的实践指南

1. 项目概述&#xff1a;一个为自律学习而生的开源利器最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的项目&#xff0c;叫KaguraNanaga/study-tracker。光看名字&#xff0c;你可能会觉得这又是一个平平无奇的“学习打卡”应用。但作为一个在效率工具和开源项目里摸爬滚打…...