【算法系列之五】对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
方法一:递归
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。
因此,该问题可以转化为:两个树在什么情况下互为镜像?
如果同时满足下面的条件,两个树互为镜像:
- 它们的两个根结点具有相同的值。
- 每个树的右子树都与另一个树的左子树镜像对称。
就像人站在镜子前审视自己那样。镜中的反射与现实中的人具有相同的头部,但反射的右臂对应于人的左臂,反之亦然。
上面的解释可以很自然地转换为一个递归函数,如下所示:
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.何为顺序二叉树 2.顺序二叉树的特点 3.顺序二叉树的遍历 3.1.前序遍历 3.2.中序遍历 3.3.后序遍历 4.顺序二叉树的注意点 [❤️算法系列之二叉树的实现(包含前序.中序.后序遍历以及 ...
- 【Python算法系列十一】二叉树的3种遍历方式
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次. 遍历二叉树的方法主要分 3 种:先序遍历.中序遍历和后序遍历: 先序遍历指最先遍历节点本身, ...
- 算法系列之五 希尔排序
对于前面讲过的基础排序来说,他们在实际使用的时候,价值并不是太大.它的价值在于,体现了一种很好的思想.通过一些改进和变化,可以达到一个不错的性能.希尔排序就是典型的一个例子,它改进了插入排序,使得算法 ...
- 【算法系列之一】二叉树最小深度
题目: 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15 ...
- leetcode系列-101.对称二叉树
题目描述: 给你一个二叉树的根节点 root , 检查它是否轴对称. 示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root = [1,2,2,nul ...
- python【数据结构与算法】判断对称二叉树
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # sel ...
- HDR视频色调映射算法(之五:flicker reduction TMO)
本文是HDR视频色调映射算法系列之五,flicker reduction TMO算法介绍. 关注公众号,获取更多信息!
- 【每日一算法】对称二叉树
每日一算法-对称二叉树 题目 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是 ...
- 二叉树常见算法题(单值二叉树、二叉树的最大深度、反转二叉树、判断两颗二叉树是否相同、对称二叉树、一颗二叉树是否是另一颗二叉树的子树)
这里的代码都是递归实现的,再强调下二叉树的概念,二叉树的构成有两种情况: 1.空树 2.根节点 + 左子树 + 右子树(这里的左子树和右子树又是一颗二叉树) 可以看出二叉树就是递归定义的,下面的算法题 ...
最新文章
- logrotate 进行nginx日志分割
- CountDownLatch实时通信
- Vue中组态实现方案-BaseMap的使用
- node --- 创建一个Socket服务器
- PDF 补丁丁 (修改PDF书签;拆分、合并、制作PDF;提取图片) 0.3.0.8 正式版
- 浪潮云海OS再度登顶 SPEC Cloud性能得分「全球第一」
- POJ3349 哈希算法
- web前端技术基础课程讲解之浅谈对soket的理解
- 所大学生都要学计算机基础吗,大学生计算机基础学期总结.docx
- 计算机用公式找出第一名,用公式查找Excel工作表中重复数据
- 马哥运维学习作业(九)
- Java 重载、重写(Override、Overload)
- C# 性能优化之斤斤计较篇 二
- centos 雷凌凌ralink无线网卡驱动 安装
- 河南省周口市安吉软件测试培训中心第一次软件测试课程——软件测试期末考试(含答案)
- java读取rar中的excel文件_java 通用文件下载 excel,pdf,word,jpg,exe,rar
- MLAPP————第十二章 隐线性模型
- github上的开源项目中gif图片的制作软件
- 细粒度图像分类模型(含实战代码)
- 输入存款金额m、存期(年)y和年利率r,计算并输出到期的利息p
热门文章
- action无法传参数给html页面,HTML 解决form表单提交时,action url中参数无效问题
- php获取悉尼时间,php在使用澳大利亚/悉尼时区时给出错误答案
- 使用数据库保存Asterisk sip账号信息(odbc方式)
- cubieboard 将linux debian 系统灌入Nand中的操作记录
- xilinx芯片管脚使用限制_修复焊接BGA芯片过程
- linux文件系统_Linux的文件系统简介
- qt 添加依赖库lib_在QT中添加LIB的方法
- inputstream java_Java实现inputstream流的复制
- 【转】Dicom 学习笔记-Dicom 消息服务(DIMSE-C/DIMSE-N)
- WSPBuilder 生成Webpart 部署包