判断一棵二叉树是否为对称二叉树的算法主要思想是判断其左子树和右子树是否在结构和节点值上具有镜像对称性。
1. 对称二叉树的定义
对于一棵二叉树,如果它的左子树和右子树镜像对称,那么这棵树就是对称的。具体来说,对于根节点 root
,其左子树 left
和右子树 right
需要满足以下条件:
left.val == right.val
left.left
与right.right
是对称的left.right
与right.left
是对称的
2. 算法思路
我们可以通过递归或迭代的方法来实现判断。
方法一:递归
递归方法的核心是构造一个辅助函数,用于比较两个节点是否镜像对称。
- 如果两棵子树都为空,则对称。
- 如果只有一棵子树为空,则不对称。
- 如果两个子树的根节点值相等,且它们的左右子树分别对称,则两棵子树对称。
递归实现代码
以下是递归方法的 Python 实现:
# 定义二叉树节点
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def is_symmetric(root):
# 辅助函数:判断两棵树是否镜像对称
def is_mirror(left, right):
if not left and not right: # 两个节点都为空
return True
if not left or not right: # 其中一个节点为空
return False
# 检查节点值是否相等,且对应子节点是否对称
return (left.val == right.val) and is_mirror(left.left, right.right) and is_mirror(left.right, right.left)
# 空树是对称的
return is_mirror(root.left, root.right) if root else True
3. 迭代方法(使用队列)
我们可以使用队列进行迭代来判断是否对称。队列中存储成对的节点,每次取出两个节点,判断它们是否镜像对称:
- 将根节点的左右孩子分别加入队列。
- 依次检查每一对出队节点是否对称,如果不对称则返回
False
。 - 如果队列为空且没有发现不对称的情况,则该树是对称的。
迭代实现代码
from collections import deque
def is_symmetric_iterative(root):
if not root:
return True
# 使用队列存储成对的节点
queue = deque([(root.left, root.right)])
while queue:
left, right = queue.popleft()
if not left and not right:
continue # 两个节点都为空,对称
if not left or not right:
return False # 其中一个节点为空,不对称
if left.val != right.val:
return False # 两个节点值不同,不对称
# 成对加入子节点以进行下一层对称判断
queue.append((left.left, right.right))
queue.append((left.right, right.left))
return True
4. 示例
给定二叉树结构如下:
1
/ \
2 2
/ \ / \
3 4 4 3
调用方法:
# 构造二叉树
root = TreeNode(1)
root.left = TreeNode(2, TreeNode(3), TreeNode(4))
root.right = TreeNode(2, TreeNode(4), TreeNode(3))
# 判断是否对称
print(is_symmetric(root)) # 输出: True
print(is_symmetric_iterative(root)) # 输出: True
5. 算法复杂度
- 时间复杂度:
O(n)
,其中n
是二叉树的节点数。每个节点只会被访问一次。 - 空间复杂度:递归方法的空间复杂度为
O(h)
,其中h
是树的高度,迭代方法的空间复杂度为O(n)
。
这两种方法都能有效判断一棵二叉树是否为对称二叉树。