返回
持续精进,破解算法难题:剑指Offer每日一题(1)
IOS
2023-09-26 17:11:07
剑指Offer每日一题(1):判断是否为对称二叉树
题目:
给定一个二叉树,判断它是否是对称的。
对称二叉树是指左右子树的对称性相同。
解析:
判断二叉树是否对称,可以采用深度优先遍历或广度优先遍历两种方式。
深度优先遍历:
- 从根节点开始,分别递归地遍历左右子树。
- 在递归过程中,比较左右子树是否对称。
- 如果左右子树都为空,则对称。
- 如果左右子树只有一个为空,则不对称。
- 如果左右子树都不为空,则比较左右子树的根节点是否相等。
- 如果左右子树的根节点相等,则继续比较左右子树的左子树和右子树。
- 重复步骤2~6,直到比较完所有节点。
广度优先遍历:
- 将根节点放入队列中。
- 从队列中取出两个节点,分别比较它们是否相等。
- 如果两个节点都为空,则对称。
- 如果两个节点只有一个为空,则不对称。
- 如果两个节点都不为空,则比较它们的左子树和右子树。
- 将两个节点的左子树和右子树放入队列中。
- 重复步骤2~6,直到队列为空。
参考代码:
def is_symmetric(root):
if not root:
return True
# 深度优先遍历
def dfs(left, right):
if not left and not right:
return True
if not left or not 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)
# 广度优先遍历
def is_symmetric_bfs(root):
if not root:
return True
queue = [root.left, root.right]
while queue:
left = queue.pop(0)
right = queue.pop(0)
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)
queue.append(right.right)
queue.append(left.right)
queue.append(right.left)
return True
总结:
判断二叉树是否对称,可以采用深度优先遍历或广度优先遍历两种方式。两种方式的实现原理基本相同,都可以有效地判断二叉树是否对称。在实际应用中,可以根据具体情况选择合适的方式。