【算法系列之五】对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1/ \2   2/ \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1/ \2   2\   \3    3

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

方法一:递归

如果一个树的左子树与右子树镜像对称,那么这个树是对称的。

Push an element in stack

因此,该问题可以转化为:两个树在什么情况下互为镜像?

如果同时满足下面的条件,两个树互为镜像:

  1. 它们的两个根结点具有相同的值。
  2. 每个树的右子树都与另一个树的左子树镜像对称。

Push an element in stack

就像人站在镜子前审视自己那样。镜中的反射与现实中的人具有相同的头部,但反射的右臂对应于人的左臂,反之亦然。

上面的解释可以很自然地转换为一个递归函数,如下所示:

public boolean isSymmetric(TreeNode root) {return isMirror(root, root);
}public boolean isMirror(TreeNode t1, TreeNode t2) {if (t1 == null && t2 == null) return true;if (t1 == null || t2 == null) return false;return (t1.val == t2.val)&& isMirror(t1.right, t2.left)&& isMirror(t1.left, t2.right);
}

复杂度分析

  • 时间复杂度:O(n)O(n)。因为我们遍历整个输入树一次,所以总的运行时间为 O(n)O(n),其中 nn 是树中结点的总数。
  • 空间复杂度:递归调用的次数受树的高度限制。在最糟糕的情况下,树是线性的,其高度为 O(n)O(n)。因此,在最糟糕的情况下,由栈上的递归调用造成的空间复杂度为 O(n)O(n)。

方法二:迭代

除了递归的方法外,我们也可以利用队列进行迭代。队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像。最初,队列中包含的是 root 以及 root。该算法的工作原理类似于 BFS,但存在一些关键差异。每次提取两个结点并比较它们的值。然后,将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。

public boolean isSymmetric(TreeNode root) {Queue<TreeNode> q = new LinkedList<>();q.add(root);q.add(root);while (!q.isEmpty()) {TreeNode t1 = q.poll();TreeNode t2 = q.poll();if (t1 == null && t2 == null) continue;if (t1 == null || t2 == null) return false;if (t1.val != t2.val) return false;q.add(t1.left);q.add(t2.right);q.add(t1.right);q.add(t2.left);}return true;
}

复杂度分析

  • 时间复杂度:O(n)O(n)。因为我们遍历整个输入树一次,所以总的运行时间为 O(n)O(n),其中 nn 是树中结点的总数。
  • 空间复杂度:搜索队列需要额外的空间。在最糟糕的情况下,我们不得不向队列中插入 O(n)O(n) 个结点。因此,空间复杂度为 O(n)O(n)。

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

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

相关文章

【算法系列之六】两整数之和

不使用运算符 和 - &#xff0c;计算两整数 a 、b 之和。 示例 1: 输入: a 1, b 2 输出: 3示例 2: 输入: a -2, b 3 输出: 1 方法一&#xff1a;递归 public static int getSum1(int a, int b) {if ((a & b) ! 0) { // 判断是否有进位return getSum1(a ^ b, (a &…

cuda默认函数与c++冲突_好程序员Python教程系列-第8讲:函数和模块

好程序员Python教程系列-第8讲&#xff1a;函数和模块&#xff0c;在讲解本章节的内容之前&#xff0c;我们先来研究一道数学题&#xff0c;请说出下面的方程有多少组正整数解。事实上&#xff0c;上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案&#xff0c;所…

【算法系列之七】合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4/*** Definition for singly-linked list.* public cla…

mfc让图片与按钮一起_对许多张图片进行批量裁剪,看看我是如何快速做到的

概要&#xff1a;当我们需要对很多图片进行批量裁剪时&#xff0c;以往的办法是自己一张一张图片去操作&#xff0c;非常麻烦。有没有这样一个工具&#xff0c;能够帮我们批量进行处理呢&#xff1f;之前小编在网上找了非常多的软件&#xff0c;一个一个地安装试用&#xff0c;…

【算法系列之八】删除链表的倒数第N个节点

给定一个链表&#xff0c;删除链表的倒数第 n 个节点&#xff0c;并且返回链表的头结点。 示例&#xff1a; 给定一个链表: 1->2->3->4->5, 和 n 2.当删除了倒数第二个节点后&#xff0c;链表变为 1->2->3->5.说明&#xff1a; 给定的 n 保证是有效的…

手写分页sql_分页查询SQL语句

表结构&#xff1a;DROP TABLE IF EXISTS zhoufoxcn.userlist;CREATE TABLE zhoufoxcn.userlist (UserId int(10) unsigned NOT NULL auto_increment,UserName varchar(45) NOT NULL,Age int(10) unsigned NOT NULL default 10,Sex tinyint(3) unsigned NOT NULL default 1,Ta…

【算法系列之九】合并两个有序数组

给定两个有序整数数组 nums1 和 nums2&#xff0c;将 nums2 合并到 nums1 中&#xff0c;使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间&#xff08;空间大小大于或等于 m n&#xff09;来保存 nums2 …

把网卡指定给vm虚拟机_为VMWare虚拟网卡指定静态的MAC地址

当你把虚拟机移到另一台主机或在同一台主机但不同的路径时&#xff0c;虚拟机的MAC地址将会更改。默认情况下VMWare会保证MAC地址的唯一性却不保存固定性&#xff0c;在每次开启虚拟机里的系统时都可能重新分配MAC地址来保证唯一性&#xff0c;若你想保证即使虚拟机被移动后&am…

【算法系列之十】三数之和

给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有满足条件且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 例如, 给定数组 nums [-1, 0, 1,…

android 动态获取全县_省市县 ------ 三级滚动(android)

预先加载仿滚轮实现的全部数据mCityPickerView.init(this);③ 点击响应&#xff1a;ss.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {CityConfig cityConfig new CityConfig.Builder().title("选择城市")//标题.build();m…

发电厂电气部分第三版pdf_火力发电厂电气主接线的特点

根据火力发电厂的容量及其在电力系统中的地位&#xff0c;一般可将火力发电厂分为区域性火力发电厂和地方性火力发电厂。这两类火力发电厂的电气主接线有各自的特点。一、区域性火力发电厂的电气主接线1、单机容量及总装机容量都较大单机容量多为300MW、600MW和少量1000MW,电厂…

【算法系列之十一】k个一组翻转链表

给出一个链表&#xff0c;每 k 个节点一组进行翻转&#xff0c;并返回翻转后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么将最后剩余节点保持原有顺序。 示例 : 给定这个链表&#xff1a;1->2->3-&g…

ghostblog主题_读Ghost博客源码与自定义Ghost博客主题

我使用的Ghost博客一直使用者默认的Casper主题。我向来没怎么打理过自己博客&#xff0c;一方面认为自己不够专业&#xff0c;很难写出质量比较高的文字&#xff1b;另一方面认为博客太耗时间&#xff0c;很容易影响正常的工作内容。最近公司即将搬迁&#xff0c;我的开发工作也…

【算法系列之十二】最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如&#xff0c;给定数组 nums [-1&#xff0c;2&#xff0c;1&#xff0c;-4], 和 target 1…

定义一个dto对象_业务代码的救星——Java 对象转换框架 MapStruct 妙用

在业务项目的开发中&#xff0c;我们经常需要将 Java 对象进行转换&#xff0c;比如从将外部微服务得到的对象转换为本域的业务对象 domainobject&#xff0c;将 domainobject 转为数据持久层的 dataobject&#xff0c;将 domainobject 转换为 DTO 以便返回给外部调用方等。在转…

JVM调优总结 -Xms -Xmx -Xmn -Xss

堆大小设置 JVM 中最大堆大小有三方面限制&#xff1a;相关操作系统的数据模型&#xff08;32-bt还是64-bit&#xff09;限制&#xff1b;系统的可用虚拟内存限制&#xff1b;系统的可用物理内存限制。32位系统 下&#xff0c;一般限制在1.5G~2G&#xff1b;64为操作系统对内存…

discuz设置用户每天回帖数_[建站教程]Discuz3.4设置QQ互联登陆教程

虽然现在很多人已经不在使用QQ了&#xff0c;但瘦死的骆驼比马大&#xff0c;QQ的用户基数还是很大&#xff0c;而且QQ里有大量的年轻用户&#xff0c;像我的表妹&#xff0c;表弟刚上初中。他们是忠诚的QQ用户。为了获取这批年轻的用户&#xff0c;我们还是有必要让网站支持QQ…

五种线程池的对比与使用

今天对五种常见的java内置线程池进行讲解。 线程使用的demo public static void cache() {ExecutorService pool Executors.newCachedThreadPool();long start System.currentTimeMillis();pool.execute(() -> {int sum 0;for (int i 0; i < 10; i) {sum (int) Ma…

16进制加法 keil_C/C++编程笔记:C语言进制详解,二进制、八进制和十六进制

我们平时使用的数字都是由 0~9 共十个数字组成的&#xff0c;例如 1、9、10、297、952 等&#xff0c;一个数字最多能表示九&#xff0c;如果要表示十、十一、二十九、一百等&#xff0c;就需要多个数字组合起来。例如表示 58 的结果&#xff0c;一个数字不够&#xff0c;只能”…

MySQL的索引是什么?怎么优化?

索引类似大学图书馆建书目索引&#xff0c;可以提高数据检索的效率&#xff0c;降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降&#xff0c;虽然官方文档说500~800w记录&#xff0c;所以大数据量建立索引是非常有必要的。MySQL提供了Explain&#xff0c;用于显示…