​面试经典150题——对称二叉树

news2024/12/22 20:21:58

1. 题目描述

image-20240417124716196

2. 题目分析与解析

2.1 思路一——递归

为了解决问题“检查一个二叉树是否是对称的”,我们需要判断树的左子树和右子树是否是彼此的镜像。这意味着树的左子树的左侧应该与右子树的右侧相同,左子树的右侧应该与右子树的左侧相同。

  1. 定义问题
    对称二叉树的定义是,一个树和它的镜像是相同的。即根节点的左子树和右子树镜像对称
  2. 基本情况
    • 如果两个树的根节点都为空,则它们是对称的。
    • 如果一个树的根节点为空而另一个不为空,则它们不对称。
  3. 递归逻辑
    • 对于两个节点,检查它们的值是否相等。
    • 如果相等,进一步检查第一个树的左子树与第二个树的右子树是否对称,以及第一个树的右子树与第二个树的左子树是否对称。
  4. 递归实现
    • 我们可以定义一个辅助函数 check(TreeNode p, TreeNode q),它接受两个节点,并返回一个布尔值表示这两个子树是否对称。
    • 我们首先检查 pq 是否都不为空。
    • 然后比较 pq 的值,如果它们相等,再递归地调用 check(p.left, q.right)check(p.right, q.left)
  5. 整体函数
    • 主函数 isSymmetric(TreeNode root) 判断整个树是否对称,只需调用 check(root, root)

实际上就是判断一个树是否沿中轴对称就是看它看作两个树:

  • 如果两个根节点的值不相等,那么返回false,确保根节点的值相等
  • 如果根节点的左值与另一个根节点的右值不等,或者根节点的右值与另一个根节点的左值不等,那么返回false
  • 只有当根节点的值相等,且根节点的左右子节点分别与另一个根节点的右左子节点相等时,才返回true

2.2 思路二——迭代

因为在理论上,任何递归算法都可以被转换为迭代算法。这是因为递归本质上是函数自调用,使用的是计算机的调用栈来保存状态;而迭代算法使用的是循环结构,在循环中显式使用数据结构(如栈或队列)来保存状态和管理控制流。

因此我们将递归算法改为迭代来解决。这种方法是将递归的深度优先搜索(DFS)转换为广度优先搜索(BFS),利用队列实现。下面是这种方法的详细解释和思路:

初始化

首先,定义一个队列 q,类型为 Queue<TreeNode>,用来存放需要比较的节点对。初始时,将根节点 root 两次加入队列,代表要比较树的左半边与右半边。

迭代过程
  1. 循环遍历
    使用一个 while 循环来处理队列中的元素,直到队列为空。在每次循环中,从队列中取出两个节点(uv),这两个节点是需要比较的对称节点。

  2. 节点比较

    • 如果两个节点都为 null,则继续下一轮循环(这表示对称位置的两个分支都正确地结束了)。
    • 如果一个节点为 null 而另一个不为 null,或者两个节点的值不相等,则树不对称,函数返回 false
  3. 节点的子节点入队

    • u 的左子节点和 v 的右子节点入队,这两个节点在对称的二叉树中应该是相等的。
    • u 的右子节点和 v 的左子节点入队,同样,这两个节点在对称的二叉树中应该是相等的。
结束条件
  • 如果队列被完全处理完并且在所有比较中节点都匹配(即没有提前返回 false),则函数返回 true,表明这棵树是对称的。

2.3 思路三

这种解题思路通过直接修改树的结构来判断二叉树是否对称,具体通过翻转二叉树的左子树,然后判断翻转后的左子树与原始的右子树是否完全相同。这里的核心思想是,如果一棵树的左子树是右子树的镜像,那么将左子树翻转后,它应该与右子树完全相同

翻转左子树 (reverse 方法)
  1. 递归翻转

    • 如果当前节点为 null,返回 null,表示该分支已处理完。
    • 递归翻转当前节点的左子节点,并存储返回的新根节点。
    • 递归翻转当前节点的右子节点。
    • 将当前节点的左指针指向翻转后的右子树,右指针指向翻转后的左子树。
  2. 返回翻转后的根节点

    • 每次递归调用后,返回当前节点,它现在代表翻转后的子树。
判断两棵树是否相同 (isSameTree 方法)
  1. 递归比较两个树
    • 如果两个节点都为 null,返回 true,表示对应的子树在这一层都结束,且相同。
    • 如果其中一个节点为 null 而另一个不为 null,返回 false,表示树结构不同。
    • 比较两个节点的值是否相等,如果不相等,返回 false
    • 递归比较左子节点和左子节点,右子节点和右子节点。
主函数逻辑
  • 翻转左子树

    • 调用 reverse 方法对 root.left 进行翻转。
  • 比较翻转后的左子树和原右子树

    • 调用 isSameTree 方法比较 root.left(翻转后的左子树)和 root.right(原始的右子树)。

3. 代码实现

3.1 思路一

image-20240417144313020

image-20240417143914438

3.2 思路二

image-20240417150738112

image-20240417150713071

3.3 思路三

image-20240417151427974

image-20240417151313443

4. 相关复杂度分析

方法1: 使用递归

时间复杂度
  • 这种方法通过递归访问每一个节点,对于每个节点,递归比较其左子节点和对称的右子节点。
  • 最坏情况下,每个节点都会被访问一次,因此时间复杂度为 O ( n ) O(n) O(n),其中 n n n 是树中节点的数量。
空间复杂度
  • 由于使用递归,主要的空间消耗来自于递归栈。
  • 在最坏的情况下(当树完全不平衡时),递归的深度可以达到 n n n,因此空间复杂度为 O ( n ) O(n) O(n)
  • 在最佳情况下(树完全平衡时),递归深度为 O ( log ⁡ n ) O(\log n) O(logn),因此空间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)

方法2: 使用迭代

时间复杂度
  • 使用一个队列来按层比较节点,确保每个节点都被访问并比较一次,所以时间复杂度为 O ( n ) O(n) O(n)
空间复杂度
  • 在最坏的情况下,队列中可能包含接近 n / 2 n/2 n/2 个节点(考虑到最后一层的宽度),因此空间复杂度也为 O ( n ) O(n) O(n)

方法3: 翻转左子树后比较两子树

时间复杂度
  • reverse 函数遍历所有节点一次,时间复杂度为 O ( n / 2 ) = O ( n ) O(n/2) = O(n) O(n/2)=O(n),因为只翻转左子树。
  • isSameTree 函数也遍历所有节点一次,时间复杂度为 O ( n ) O(n) O(n)
  • 总的时间复杂度为 O ( n ) O(n) O(n)
空间复杂度
  • reverse 和 isSameTree 函数都使用递归,因此空间复杂度主要由递归栈决定。
  • 在最坏情况下,递归深度可以达到 n n n(非平衡树),因此空间复杂度为 O ( n ) O(n) O(n)
  • 在最佳情况下(树完全平衡时),递归深度为 O ( log ⁡ n ) O(\log n) O(logn),因此空间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)

image-20240301121908772

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

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

相关文章

基于springboot实现人口老龄化社区服务与管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现人口老龄化社区服务与管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了人口老龄化社区服务与管理平台的开发全过程。通过分析人口老龄化社区服务与管理平台方面的不足&#xff…

Gitee和Git学习笔记

Gitee和Git指令 Gitee提交代码方法1 先将仓库clone到本地&#xff0c;修改后再push到 Gitee 的仓库方法2 本地初始化一个仓库&#xff0c;设置远程仓库地址后再做push 切换分支下载代码通过git clone克隆仓库通过下载 ZIP 的方式下载代码 Git提交指令 解决本地库同时关联GitHub…

货币保卫战,美联储降息预期推迟,油价飙升110美元,亚洲市场股债汇三杀,各国央行操作难度上升!

货币保卫激战 美联储降息预期一降再降&#xff0c;叠加中东局势变化带来避险需求飙升&#xff0c;美元连续第五天上涨之际&#xff0c;新兴市场再次打响“货币保卫战”&#xff0c;而更大的风险似乎仍未过去。亚洲市场普跌&#xff0c;日股跌近2%&#xff0c;韩国股指跌超2%&a…

【好书推荐6】《Excel函数与公式应用大全for Excel 365 Excel 2021》

【好书推荐6】《Excel函数与公式应用大全for Excel 365 & Excel 2021》 写在最前面《Excel函数与公式应用大全for Excel 365 & Excel 2021》关键点内容简介作者简介前言/序言目录 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&…

新手怎么做好抖音小店?这六点是做店的根本,新手商家做店必读

大家好&#xff0c;我是电商花花。 只要我们开通抖音小店&#xff0c;且缴纳好类目保证金&#xff0c;就可以正常选品&#xff0c;上架商品进行售卖了。 如果你是刚开通抖音小店&#xff0c;想要做好抖音小店&#xff0c;下面这几点&#xff0c;一定要注意看。 一、开通精选联…

低版本Oracle客户端或者CMD连接Oracle 12c数据库报错ORA-1017 ORA-12560

exp test_user/test_user123456jgzh fileC:\jgzh.dmp owner(msagx) compressy; exp test_user/test_user123456jgzh fileD:\jgzh.dmp tables(msagx.C_CB_STUDENT,msagx.C_CB_SUBJECT) feedback10000 compressy;

残差网络理解

看了知乎的一篇关于残差网络的文章&#xff0c;https://zhuanlan.zhihu.com/p/72679537&#xff0c;我想发表一点我自己的看法&#xff01; 1.我对残差网络的理解 残差网络&#xff08;ResNet&#xff09;确实与传统的卷积神经网络&#xff08;CNN&#xff09;在结构上有所不同…

Qwen1.5大语言模型微调实践

在人工智能领域&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的兴起和广泛应用&#xff0c;为自然语言处理&#xff08;NLP&#xff09;带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者&#xff0c;不仅拥有强大的语言生成和理…

冯诺依曼与进程【Linux】

文章目录 冯诺依曼体系结构&#xff08;从硬件的角度描述&#xff09;冯诺依曼体系结构&#xff08;从软件的角度描述&#xff09;操作系统&#xff08;软件&#xff09;理解管理系统调用和库函数进程查看进程的两种方式 通过系统调用获取进程的PID和PPID通过系统调用创建进程-…

解决Error (169281)、Error (169282)报错问题,QuartusII设置Virtual Pin虚拟管脚的详细操作方法

解决Error(169281)、Error(169282)报错问题,QuartusII设置Virtual Pin虚拟管脚的详细操作方法 1,QuartusII报错信息2,解决办法3,重新编译,成功参考文献: 1,Quartus如何设置虚拟管脚Virtual Pin(具体设置方法) 1,QuartusII报错信息 报错原因:    为了验证FPGA工…

Nginx内存池相关源码剖析(三)小块内存分配逻辑

在Nginx中&#xff0c;小块内存通常指的是那些大小相对较小、分配和释放频率较高的内存块。这些内存块由于数量众多、管理复杂&#xff0c;因此需要使用一种高效的内存管理机制来减少内存管理的开销和内存碎片的产生。 Nginx内存池通过一种预分配和复用的方式来管理小块内存。当…

1688店铺商品接口全攻略:一键获取商品信息,轻松玩转电商数据!

1688店铺所有商品接口技术详解 一、引言 随着电子商务的快速发展&#xff0c;越来越多的商家选择通过1688平台开展业务。为了方便商家获取店铺内所有商品的信息&#xff0c;1688平台提供了相应的API接口。本文将详细介绍如何使用这些接口获取店铺所有商品的信息&#xff0c;以…

Learn something about front end——颜色

​ 好装的标题啊哈哈哈哈哈哈 最近get了一个学习前端的网站叫FreeCodeCamp 原色&#xff1a;rgb三个值的其中一个值拉满&#xff0c;比如说rgb(255,0,0)是红色这样&#xff0c;三个主色&#xff1a; 红色 rgb(255, 0, 0) #FF0000绿色 rgb(0, 255, 0) #00FF00蓝色 rgb(0, 0, …

记录-海思开发板的 嵌入式nginx和 php的移植(交叉编译环境配置)

嵌入式 lnmp搭建的记录 N&#xff1a;NginxP&#xff1a;php编译PHP可能遇到的问题configure阶段&#xff1a;Makefile-make阶段&#xff1a;Makefile-make install阶段&#xff1a; 文章比较水&#xff0c;并没有没解决什么实际问题&#xff0c;有点不好意思发布。但好像又记录…

网工交换技术基础——VLAN原理

1、VLAN的概念&#xff1a; VLAN(Virtual LAN)&#xff0c;翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络&#xff0c;也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。 2、VLAN的主要作用&#xf…

【网站项目】学生选课系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Pandas数据分析学习笔记

前言 开刷Pandas数据分析&#xff0c;看起来很好理解&#xff0c;不过没做笔记没敲代码心里总是不安稳&#xff0c;所以复现下课程代码并演示其中遇到的问题&#xff0c;顺便水一水笔记好了 参考资料&#xff1a; 课程视频链接&#xff1a;Pandas数据分析从入门到实战 数据…

福州复式装修,115平四室三厅现代简约风。福州中宅装饰,福州装修

设计亮点 设计理念&#xff1a; 静享时光谧境 克制的优雅&#xff0c;简约的沉淀 以光为引&#xff0c;以意为境 案例简介&#xff1a; 该方案现代风格为整个设计带来现代的舒适感&#xff0c;各种材质相互碰撞的设计&#xff0c;即保持着整齐的视感&#xff0c;又将高级气质凸…

分布式锁设计

一 分布式环境互斥实现 1 数据库锁 1.1 悲观锁 innodb行锁 共享锁&#xff08;S Lock&#xff09;:允许事务读一行数据&#xff0c;具有锁兼容性质&#xff0c;允许多个事务同时获得该锁。排它锁&#xff08;X Lock&#xff09;:允许事务删除或更新一行数据&#xff0c;具有…

ATA-300系列功率放大器全新升级

一、公司介绍 Aigtek是国产专业从事测量仪器研发、生产和销售的高科技企业。公司主要研发和生产功率放大器、功率放大器模块、功率信号源、计量校准源等产品。核心团队主要是来自西安交通大学及西北工业大学的专家教授等联合组成研发团队&#xff0c;目前拥有数量众多的专利和…