题解:
首先我们要清楚,对称二叉树,比较的不是左右节点,而是根节点的左右子树是不是相互翻转的。比较的是两个树。就是说左子树的左节点和右子树的右节点做比较,左子树的右节点和右子树的左节点做比较。
我们使用递归方法。
1.递归函数的参数和返回值
前面已经说过了,比较的是两个树,自然是左子树和右子树节点
返回值是bool类型
compare(left, right)
2.终止条件
节点为空的情况
- 左节点为空,右节点不为空,不对称,False
- 左不为空,右为空,不对称,False
- 左右都为空,True
节点不为空的情况
- 左右都不为空,节点数值不相同,False
3.单层递归逻辑
- 比较二叉树的外侧是否对称,传入的是左子树的左孩子,右子树的右节点
- 比较二叉树的内侧是否对称,传入左节点的右孩子,右节点的左孩子
- 左右都对称返回True,有一侧不对称返回False
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
def compare(left, right):
if not left and right:
return False
elif left and not right:
return False
elif not left and not right:
return True
elif left.val != right.val:
return False
outsides = compare(left.left, right.right)
inside = compare(left.right, right.left)
return outsides and inside
if not root:
return True
return compare(root.left, root.right)