给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
# 方法一 递归
class Solution1:
def isSymmetric(self, root):
if not root: # 先判断根节点是否为空
return True
return self.isMirror(root.left, root.right) # 分成左子树和右子树判断
def isMirror(self, p, q): # 判断两棵树是否是镜像树
if not p and not q: # 根节点都为空,是
return True
if not p or not q: # 其中有一棵为空,不是
return False
l = self.isMirror(p.left, q.right) # p的左子树和q的右子树是否相同
r = self.isMirror(p.right, q.left) # p的右子树和q的左子树是否相同
return p.val == q.val and l and r # 值相等,并且p的左=q的右,p的右=q的左
# 递归
def isSymmetric(root: TreeNode) -> bool:
def help(left, right):
# left/right都为空节点
if not left and not right:
return True
# left/right有一个为空
if not (left and right):
return False
# 值是否相等
if left.val != right.val:
return False
# 将左右字节对称递归比较
return help(left.left, right.right) and help(left.right, right.left)
return help(root.left, root.right) if root else True
# 迭代
def isSymmetric1(root: TreeNode) -> bool:
# 如果root节点为空, 或则单个root节点, 则返回True
if not root or (not root.left and not root.right):
return True
# 如果left和right只有一个节点为空, 则返回False
if not (root.left and root.right):
return False
left = [root.left]
right = [root.right]
while left:
leftNode = left.pop()
rightNode = right.pop()
# 如果节点不相等, 则返回False
if leftNode.val != rightNode.val:
return False
# 将左子树的左节点和右子树的右节点写入left/right数组中
if leftNode.left and rightNode.right:
left.append(leftNode.left)
right.append(rightNode.right)
elif leftNode.left or rightNode.right:
return False
# 将左子树的右节点和右子树的左节点写入left/right数组中
if leftNode.right and rightNode.left:
left.append(leftNode.right)
right.append(rightNode.left)
elif leftNode.right or rightNode.left:
return False
return True