题目描述
示例
方法一:递归
思路和算法
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。
如果同时满足下面的条件,两个树互为镜像:
- 它们的两个根节点具有相同的值
- 每个树的右子树都与另一个树的左子树镜像对称
我们可以实现这样一个递归函数,通过【同步移动】两个指针的方法来遍历这棵树,p指针和q指针一开始都指向这棵树的根,随后p右移时,q左移;p左移时,q右移。每次检查当前p和q节点的值是否相等,如果相等再判断左右子树是否对称。
代码
# 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: TreeNode) -> bool:
def check(p, q):
if p is None and q is None:
return True
if p is None or q is None:
return False
return p.val == q.val and check(p.left, q.right) and check(p.right, q.left)
return check(root, root)
方法二:迭代
思路和算法
首先,我们引入一个队列,这是把递归程序改写成迭代程序的常用方法。
初始化时,我们把根节点入队两次。每次提取两个节点并比较它们的值(队列中每两个连续的节点应该是相等的,而且它们的子树互为镜像),然后将两个节点的左右子节点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续节点)时,该算法结束。
代码
# 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: 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)
# 如果两个节点都为空就继续循环,两者有一个为空就返回False
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