解法一:递归
对称二叉树问题可以转换为left, right两个树是否为镜像问题。镜像需要满足的条件是:
- left与right同时为空,或同时不为空且值相同;
- left的左子树与right的右子树镜像并且left的右子树与right左子树是镜像。
问题入口即变成root与root是否为镜像,即自己与自己是否镜像。一个对称二叉树一定自己与自己也是镜像。
class Solution:def isSymmetric(self, root: TreeNode) -> bool:def check(left: TreeNode, right: TreeNode) -> bool:if not left and not right:return Trueif not left or not right:return Falseif left.val != right.val:return Falsereturn check(left.left, right.right) and check(left.right, right.left)return check(root, root)
解法二:同步BFS
用一个队列,将两棵树的镜像遍历节点按顺序加入队列,同步BFS的过程中判断节点是否为空(均为空、一个为空)、都不为空的情况下值是否相等。
class Solution:def isSymmetric(self, root: TreeNode) -> bool:def check(left: TreeNode, right: TreeNode) -> bool:queue = [left, right]while queue:left = queue.pop(0)right = queue.pop(0)if not left and not right:# 注意这里是continue,应为迭代法需要迭代完成没有返回False才表示镜像continueif not left or not right:return Falseif left.val != right.val:return Falsequeue.extend([left.left, right.right, left.right, right.left])# 迭代完成,确认镜像return Truereturn check(root, root)
同类题
100. 相同的树
递归
class Solution:def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:if not p and not q:return Trueif not p or not q:return Falsereturn p.val == q.val and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
迭代和对称二叉树也差不多。
