思路:左子树和右子相等,也就是说要递归的比较左子树和右子树。我们将根节点的左子树记做 left,右子树记做 right。比较 left 是否等于 right,不等的话直接返回就可以了。如果相当,比较 left 的左节点和 right 的右节点,再比较 left 的右节点和 right 的左节点。
# 深度优先搜索
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if not root: # 空树
return True
def DFS(left, right):
if not (left or right): # 左右子树,都为空
return True
if not (left and right): # 左右子树,一边为空
return False
if left.val != right.val:
return False
return DFS(left.left, right.right) and DFS(left.right, right.left)
return DFS(root.left, root.right)
方法二:广度优先搜索
思路:基本上一致,用队列做载体输出。
# 广度优先搜索
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if not root or not (root.left or root.right):
return True
queue = [root.left, root.right]
while queue:
left = queue.pop(0)
right = queue.pop(0)
if not (left or right): # 左右子树,都为空
continue
if not (left and right): # 左右子树,一边为空
return False
if left.val != right.val:
return False
queue.append(left.left)
queue.append(right.right)
queue.append(left.right)
queue.append(right.left)
return True