当前位置: 首页 > 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…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

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版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...