返回
透过剖析解题思路:二叉树对称性问题剖析
前端
2023-10-09 20:09:42
二叉树是对称的,这意味着它的左右子树是镜像对称的。换句话说,如果我们把二叉树沿中轴线折叠,那么左右两侧的子树就会完全重合。
检查二叉树是否对称的一种简单方法是使用递归。我们可以从根节点开始,然后递归地检查它的左右子树。如果左右子树都是对称的,那么整个二叉树也是对称的。
def is_symmetric(root):
"""
检查二叉树是否对称。
Args:
root: 二叉树的根节点。
Returns:
如果二叉树对称,返回 True。否则,返回 False。
"""
# 如果二叉树为空,则它是对称的。
if not root:
return True
# 如果二叉树只有一个节点,则它是对称的。
if not root.left and not root.right:
return True
# 如果二叉树的左右子树都不为空,则递归地检查它们是否对称。
if root.left and root.right:
return is_symmetric(root.left) and is_symmetric(root.right) and root.left.val == root.right.val
# 如果二叉树的左子树或右子树为空,则它不是对称的。
return False
另一种检查二叉树是否对称的方法是使用广度优先搜索。我们可以从根节点开始,然后把它的左右子树加入队列中。然后,我们从队列中取出两个节点,并检查它们是否对称。如果它们对称,那么我们把它们的左右子树加入队列中。否则,我们跳过它们的子树。
def is_symmetric(root):
"""
检查二叉树是否对称。
Args:
root: 二叉树的根节点。
Returns:
如果二叉树对称,返回 True。否则,返回 False。
"""
# 如果二叉树为空,则它是对称的。
if not root:
return True
# 创建一个队列,并把根节点加入队列中。
queue = [root]
# 循环,直到队列为空。
while queue:
# 从队列中取出两个节点。
node1 = queue.pop(0)
node2 = queue.pop(0)
# 如果两个节点都不为空,则检查它们是否对称。
if node1 and node2:
if node1.val != node2.val:
return False
# 如果两个节点的左右子树都不为空,则把它们加入队列中。
if node1.left and node2.right:
queue.append(node1.left)
queue.append(node2.right)
# 如果两个节点的左右子树都为空,则跳过它们。
elif not node1.left and not node2.right:
continue
# 如果两个节点的左右子树只有一个不为空,则二叉树不是对称的。
else:
return False
# 如果两个节点中有一个为空,则二叉树不是对称的。
elif node1 or node2:
return False
# 如果队列为空,则二叉树是