剑指 Offer(第2版)面试题 28:对称的二叉树

剑指 Offer(第2版)面试题 28:对称的二叉树

  • 剑指 Offer(第2版)面试题 28:对称的二叉树
    • 解法1:递归
    • 解法2:镜像二叉树 + 前序遍历

剑指 Offer(第2版)面试题 28:对称的二叉树

题目来源:39. 对称的二叉树

解法1:递归

递归判断两个子树是否互为镜像。

两个子树互为镜像当且仅当:

  1. 两个子树的根节点值相等。
  2. 第一棵子树的左子树和第二棵子树的右子树互为镜像,且第一棵子树的右子树和第二棵子树的左子树互为镜像。

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution
{
public:bool isSymmetric(TreeNode *root){// 特判,空树是对称的二叉树if (root == nullptr)return true;return dfs(root->left, root->right);}bool dfs(TreeNode *root1, TreeNode *root2){if (root1 == nullptr && root2 == nullptr)return true;if ((root1 && root2 == nullptr) || (root1 == nullptr && root2))return false;if (root1->val != root2->val)return false;return dfs(root1->left, root2->right) && dfs(root1->right, root2->left);}
};

复杂度分析:

时间复杂度:O(n),其中 n 是二叉树的节点数。

空间复杂度:O(depth),其中 depth 是二叉树的深度。极端情况下栈的深度将达到 O(n)。

解法2:镜像二叉树 + 前序遍历

我们发现:如果一个二叉树是对称的,则它的前序遍历序列和它的镜像二叉树的前序遍历序列相同。

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution
{
public:bool isSymmetric(TreeNode *root){if (root == nullptr)return true;vector<int> preOrderSequence, mirrorPreOrderSequence;preOrder(root, preOrderSequence);mirror(root);preOrder(root, mirrorPreOrderSequence);return preOrderSequence == mirrorPreOrderSequence;}// 辅函数 - 镜像void mirror(TreeNode *root){if (root == nullptr)return;if (root->left == nullptr && root->right == nullptr)return;if (root->left)mirror(root->left);if (root->right)mirror(root->right);// swap(root->left, root->right)TreeNode *temp = root->left;root->left = root->right;root->right = temp;}// 辅函数 - 前序遍历void preOrder(TreeNode *root, vector<int> &nums){if (root == nullptr){nums.push_back(-1);return;}nums.push_back(root->val);preOrder(root->left, nums);preOrder(root->right, nums);}
};

复杂度分析:

时间复杂度:O(n),其中 n 是二叉树的节点个数。原树中每个节点仅被遍历一次。

空间复杂度:O(depth),其中 depth 是二叉树的深度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kernel(三):kernel移植

本文主要探讨210官方kernel移植。 配置文件选择 选择配置文件smdkv210_android_defconfig(arch/arm/configs) 修改主Makefile 配置cpu架构和交叉编译工具链 vim MakefileARCH ? armCROSS_COMPILE ? /root/arm-2009q3/bin/arm-none-linux-gnueabi- 初步编译烧…

使用对象处理流ObjectOutputStream读写文件

注意事项: 1.创建的对象必须实现序列化接口,如果属性也是类&#xff0c;那么对应的类也要序列化 2.读写文件路径问题 3.演示一个例子 &#xff08;1&#xff09;操作的实体类FileModel&#xff0c;实体类中有Map,HashMap这些自带的本身就实现了序列化。 public class File…

Gradio: 实时性能反馈的机器学习演示工具 | 开源日报 No.107

comfyanonymous/ComfyUI Stars: 17.5k License: GPL-3.0 这个项目是 ComfyUI&#xff0c;它提供了一个图形化界面和后端来设计和执行复杂的稳定扩散工作流程。 节点/图表/流程图接口用于实验并创建复杂的稳定扩散工作全面支持不同版本的 Stable Diffusion异步队列系统部分更新…

薅github的羊毛-用pages建自己的博客或资源站 - 博客工具 - 2/2

笔者调研了好多个静态博客工具&#xff0c;最后锁定Hexo了&#xff0c;但不等于其他博客不行。我只吐槽两个 Hugo - 难用Gridea - 简直就是骗钱的&#xff0c;我交钱用不了 theme没有链接&#xff0c;同步也同步不了&#xff0c;估计以前是可以&#xff0c;现在经营不下去&…

十大经典排序算法知识体系终结篇

目录 一. 前言 二. 冒泡排序&#xff08;Bubble Sort&#xff09; 2.1. 概念 2.2. 算法步骤 2.3. 代码实现 三. 选择排序&#xff08;Selection Sort&#xff09; 3.1. 概念 3.2. 算法步骤 3.3. 代码实现 四. 插入排序&#xff08;Insertion Sort&#xff09; 4.1. …

wireshark使用

1、抓包界面介绍 2、过滤 (1) ip过滤 or 端口过滤 ip.src 192.168.1.104 显示源地址为192.168.1.104的数据包列表 ip.dst192.168.1.104, 显示目标地址为192.168.1.104的数据包列表 ip.addr 192.168.1.104 显示源IP地址或目标IP地址为192.168.1.104的数据包列表 port 80 …

C++进阶篇9---类型转换

C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与 接收返回值类型不一致时&#xff0c;就需要发生类型转化&#xff0c;C语言中总共有两种形式的类型转换&#xff1a;隐式类型 转换和…

RRC下的NAS层

无线资源控制&#xff08;Radio Resource Control&#xff0c;RRC&#xff09;&#xff0c;又称为无线资源管理&#xff08;RRM&#xff09;或者无线资源分配&#xff08;RRA&#xff09;&#xff0c;是指通过一定的策略和手段进行无线资源管理、控制和调度&#xff0c;在满足服…

2.操作符详解

1.10进制转二进制方法 所以125的二进制就是1111101 2.2进制转8进制: 从2进制序列中右边最低位开始向左每3个2进制位换算为一个8进制位&#xff0c;剩余不够3个2进制位的直接换算 例:01101011转为01 101 011 即1 5 3 即8进制的153 还原回去的话: 将3化为011放最右边,5化…

使用PM2,在生产环境稳定运行你的node项目

PM2 一个 node&#xff0c;本身就用几行代码&#xff0c;就可以启动个 server 进程&#xff0c;监听个端口&#xff0c;为大家提供 Web 服务 一、依赖安装 npm install pm2 -g 二、命令行启动 普通执行启动 pm2 start <js 文件路径 >.js 携带参数启动 pm2 start < 某种…

【数学】整除与同余

基本概念 在数论中&#xff0c;整除不得不说是一种最为基础的知识了。 a a a 整除 b b b&#xff0c;记作 a ∣ b a|b a∣b 设 a , b ∈ Z a,b\in\Z a,b∈Z 且 b ≠ 0 b\ne 0 b0&#xff0c;则 b ∣ a b|a b∣a 当且仅当 ∃ q ∈ Z \exist q\in\Z ∃q∈Z 满足 q b …

re:Invent 云端历程:Swami Sivasubramanian 博士主题演讲-数据共生与开放

re:Invent 云端历程&#xff1a;Swami Sivasubramanian 博士主题演讲-数据共生与开放 亚马逊云科技 re:Invent 大会简介 亚马逊云科技 re:Invent 是亚马逊云科技为全球云计算社区举办的学习大会。是云计算领域的行业风向标&#xff0c;科技界的全球年度重磅盛会。 亚马逊云科…

Golang 领域驱动设计(DDD)最佳实践

Golang 领域驱动设计(DDD)最佳实践 Golang 领域驱动设计(DDD)最佳实践背景整体设计合理的创建标题,有助于目录的生成代码实现领域层什么是实体(Entity)?基础设施层数据对象表现层一些技巧检查结构体是否实现了某接口的防御代码适应于 Go Web 应用的错误处理对象拷贝Gol…

Docker笔记:简单部署 nodejs 项目和 golang 项目

docker 简单的维护 nodejs 项目容器 1 &#xff09;Nodejs 程序 const express require(express) const app express()app.get(/, (req, res) > {res.send(首页) })app.get(/news, (req, res) > {res.send(news) })// dokcer 做端口映射不要指定ip app.listen(3000)2…

爬虫学习日记第九篇(爬取seebug)

目标&#xff1a;https://www.seebug.org/vuldb/vulnerabilities 需求&#xff1a;爬取cve_id及影响组件 单线程 cookie是有时效的(过一段时间就不行了&#xff0c;大概半小时左右)&#xff0c;但是并不需要登录(直接抓包拿到的请求头) import base64 import json import ur…

vue 封装对象深拷贝方法

vue 封装对象深拷贝方法 在 src/ utils文件夹下面新建index.js // index.js// 深拷贝对象 export function deepClone(obj) {const _toString Object.prototype.toString// null, undefined, non-object, functionif (!obj || typeof obj ! object) {return obj}// DOM Nodei…

cuda version 管理

https://towardsdatascience.com/managing-multiple-cuda-versions-on-a-single-machine-a-comprehensive-guide-97db1b22acdchttps://towardsdatascience.com/managing-multiple-cuda-versions-on-a-single-machine-a-comprehensive-guide-97db1b22acdc不同项目设置不同的cuda…

Python网络编程基础:探索网络的未知领域

写在开头 在当今数字化时代&#xff0c;网络已经贯穿我们生活的方方面面&#xff0c;成为信息传递和交流的重要媒介。而Python&#xff0c;作为一门强大而灵活的编程语言&#xff0c;自然也在网络编程领域展现出其强大的一面。本文将带领读者进入Python网络编程的未知领域&…

小航助学2023年9月电子学会Scratch四级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 单选题3.00分 删除编辑附件图文 答案:A 第1题角色为一个紫色圆圈&#xff0c;运行程序后&#xff0c;舞台上的图案是&#xff1f;&#xff08; &#xff09; A…

Spring定时任务动态更改(增、删、改)Cron表达式方案实例详解

Spring定时任务动态更改&#xff08;增、删、改&#xff09;Cron表达式方案实例详解 最近在做一个需求&#xff0c;用户可以在平台上配置任务计划数据&#xff08;就是任务的执行和描述的相关信息&#xff0c;包括任务参数、cron表达式&#xff09;&#xff0c;配置后&#xf…