101. 对称二叉树
题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
假设这棵树张这个样子:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
分析
按照解答二叉树问题的惯例,我们给出两种解答(递归和非递归)。
首先,判断一棵二叉树是否对称的条件可以分为以下几种:
1. 根节点无左子树和右子树,此时一定是对称的,返回True。
2. 根节点有左子树或者右子树,但是只有一边,此时一定不对称,返回False。
3. 根节点两边子树都有,此时左子树的左节点等于右字数的右节点,右子树的左节点等于左节点的右节点,同时满足三个条件才可以返回True。
递归方案
按照常规的思维方式,我们先给出递归的解决方案:
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
return self.isMirror(root,root)
def isMirror(self, node1: TreeNode, node2: TreeNode) -> bool:
if not node1 and not node2: return True #条件1
if not node1 or not node2: return False #条件2
return node1.val == node2.val and self.isMirror(node1.left, node2.right) and self.isMirror(node1.right, node2.left) #条件3,递归判断
时间复杂度:O(n)
空间复杂度:O(n)
实际运行结果:
非递归方案
而非递归方案则使用了遍历的方法,将二叉树中的元素放在同个数组里,然后通过循环数组来判断它是不是对称数组。
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
queue = [root]
while queue:
values = [i.val if i else None for i in queue]
if values != values[::-1]: return False
queue = [child for i in queue if i for child in (i.left, i.right)]
return True
时间复杂度:O(n)
空间复杂度:O(n)
实际运行结果:
小结
可以看出,两种方法消耗的资源差距并不大,但是递归的方法更加好理解一些。而遍历这种非遍历的方法并不是此题的最优解。
但是我还是列出来吧,毕竟按照惯例,递归和非递归两种方法都要有的。
About me: 资深大猪蹄子
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)