对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
思路:
这道题我喜欢这样理解:比如对于一棵树
我们写一个一模一样的出来:
可以发现,若一棵树是对称的,那再在右边复制出一棵树,这两个图形也是对称的。这是非常简单的对称图的性质。所以我们写递归函数的时候,传两个参数,root1和root2,虽然这两个参数都是同一个根节点root,但我们写成两棵树非常有助于我们理解代码。
即:现在我们将判断一棵树自身是否对称转化为判断两棵树是否对称。对于给定的两个根节点,我们首先要判断它们是否一致,若不一致则直接返回False;若一致,则判断root1的左子树和root2的右子树是否一致以及root2的右子树和root1的左子树是否一致(通过复制出两棵树的方式我们很容易理解这是出于对称性质的写法)。
代码:
class Solution(object):
def isSymmetric(self, root):
#假设有俩个 树 看对称就好啦
def duichen(root1,root2):
if not root1 and not root2:#都为空 可以 反正是一致
return True
if not root1 or not root2:#恰有一个为空 不行了 不一致
return False
if root1.val != root2.val:#都不为空,但值不同 不行
return False
else:#剩下只有都不为空,且值相同。那么要:“左对应右,右对应左”
return duichen(root1.left,root2.right) and duichen(root1.right,root2.left)
return duichen(root,root)
小结:
这里定义的递归函数duichen(root1,root2)功能定义很明确:传入两个二叉树的根节点,判断这两棵树是否是对称。
从单层定义来看:先判断两个节点是否一致,若不一致直接必然不对称直接返回False;若一致则判断root1的左和root2的右是否对称以及root1的右和root2的左是否对称,若两个条件都满足,则root1和root2对称。
只要明确定义了递归函数的功能,再调用时只要注重它的功能用法,而不是跳进递归里去绕。通过最外面单层,就可以实现整个功能。
( 题目当中还有个用迭代来实现的进阶要求,用迭代的方式其实就是使用层序遍历,我们把每一层的元素取出来,判断是否是“回文”即可——但不同的是这里我们要把None节点也要考虑进去,以免把
这种情况当成对称处理。至于其他地方与层序遍历并无区别,关于层序遍历会专门有道题,所以这里迭代的方式就写个思路吧~)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了