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

例如,二叉树 [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

说明:

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

方法一:递归

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

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

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

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

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

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

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)。

【算法系列之五】对称二叉树相关推荐

  1. 【❤️算法系列之顺序二叉树的实现(前序遍历、中序遍历、后序遍历)❤️】

    1.何为顺序二叉树 2.顺序二叉树的特点 3.顺序二叉树的遍历 3.1.前序遍历 3.2.中序遍历 3.3.后序遍历 4.顺序二叉树的注意点 [❤️算法系列之二叉树的实现(包含前序.中序.后序遍历以及 ...

  2. 【Python算法系列十一】二叉树的3种遍历方式

    二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次. 遍历二叉树的方法主要分 3 种:先序遍历.中序遍历和后序遍历: 先序遍历指最先遍历节点本身, ...

  3. 算法系列之五 希尔排序

    对于前面讲过的基础排序来说,他们在实际使用的时候,价值并不是太大.它的价值在于,体现了一种很好的思想.通过一些改进和变化,可以达到一个不错的性能.希尔排序就是典型的一个例子,它改进了插入排序,使得算法 ...

  4. 【算法系列之一】二叉树最小深度

    题目: 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15 ...

  5. leetcode系列-101.对称二叉树

    题目描述: 给你一个二叉树的根节点 root , 检查它是否轴对称. 示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root = [1,2,2,nul ...

  6. python【数据结构与算法】判断对称二叉树

    # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # sel ...

  7. HDR视频色调映射算法(之五:flicker reduction TMO)

    本文是HDR视频色调映射算法系列之五,flicker reduction TMO算法介绍. 关注公众号,获取更多信息!

  8. 【每日一算法】对称二叉树

    每日一算法-对称二叉树 题目 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1   / \  2   2 / \ / \ 3  4 4  3 但是 ...

  9. 二叉树常见算法题(单值二叉树、二叉树的最大深度、反转二叉树、判断两颗二叉树是否相同、对称二叉树、一颗二叉树是否是另一颗二叉树的子树)

    这里的代码都是递归实现的,再强调下二叉树的概念,二叉树的构成有两种情况: 1.空树 2.根节点 + 左子树 + 右子树(这里的左子树和右子树又是一颗二叉树) 可以看出二叉树就是递归定义的,下面的算法题 ...

最新文章

  1. logrotate 进行nginx日志分割
  2. CountDownLatch实时通信
  3. Vue中组态实现方案-BaseMap的使用
  4. node --- 创建一个Socket服务器
  5. PDF 补丁丁 (修改PDF书签;拆分、合并、制作PDF;提取图片) 0.3.0.8 正式版
  6. 浪潮云海OS再度登顶 SPEC Cloud性能得分「全球第一」
  7. POJ3349 哈希算法
  8. web前端技术基础课程讲解之浅谈对soket的理解
  9. 所大学生都要学计算机基础吗,大学生计算机基础学期总结.docx
  10. 计算机用公式找出第一名,用公式查找Excel工作表中重复数据
  11. 马哥运维学习作业(九)
  12. Java 重载、重写(Override、Overload)
  13. C# 性能优化之斤斤计较篇 二
  14. centos 雷凌凌ralink无线网卡驱动 安装
  15. 河南省周口市安吉软件测试培训中心第一次软件测试课程——软件测试期末考试(含答案)
  16. java读取rar中的excel文件_java 通用文件下载 excel,pdf,word,jpg,exe,rar
  17. MLAPP————第十二章 隐线性模型
  18. github上的开源项目中gif图片的制作软件
  19. 细粒度图像分类模型(含实战代码)
  20. 输入存款金额m、存期(年)y和年利率r,计算并输出到期的利息p

热门文章

  1. action无法传参数给html页面,HTML 解决form表单提交时,action url中参数无效问题
  2. php获取悉尼时间,php在使用澳大利亚/悉尼时区时给出错误答案
  3. 使用数据库保存Asterisk sip账号信息(odbc方式)
  4. cubieboard 将linux debian 系统灌入Nand中的操作记录
  5. xilinx芯片管脚使用限制_修复焊接BGA芯片过程
  6. linux文件系统_Linux的文件系统简介
  7. qt 添加依赖库lib_在QT中添加LIB的方法
  8. inputstream java_Java实现inputstream流的复制
  9. 【转】Dicom 学习笔记-Dicom 消息服务(DIMSE-C/DIMSE-N)
  10. WSPBuilder 生成Webpart 部署包