📜  数据结构 |二叉树 |问题 6(1)

📅  最后修改于: 2023-12-03 14:54:56.120000             🧑  作者: Mango

数据结构 | 二叉树 | 问题 6

二叉树是一种非常重要的数据结构,在计算机科学中被广泛应用。在处理树形结构的数据时,二叉树为我们提供了一种很有效的方式。问题 6 将帮助我们更好地理解和操作二叉树。

问题描述

给定一个二叉树,判断它是否是镜像对称的。即根节点的左子树和右子树对称(结构相同,值相等)。

例如,下面的二叉树是对称的:

     1
    / \
   2   2
  / \ / \
 3  4 4  3

而下面的二叉树不是对称的:

     1
    / \
   2   2
    \   \
    3    3
解决方案

我们可以使用递归或迭代的方式解决这个问题。下面分别介绍这两种解决方案。

递归解决方案

我们可以定义一个递归函数 isSymmetricHelper,该函数用于判断两个节点是否对称。具体步骤如下:

  1. 如果根节点为空,返回 True
  2. 调用递归函数 isSymmetricHelper 分别比较左子树和右子树。
  3. 在递归函数中,如果两个节点都为空,返回 True
  4. 如果两个节点中有一个为空,或者它们的值不相等,返回 False
  5. 递归比较左子树的左节点和右子树的右节点,并递归比较左子树的右节点和右子树的左节点。
  6. 如果上述两次递归均返回 True,则说明树是对称的。

下面是递归解决方案的示例代码:

class Solution:
    def isSymmetric(self, root):
        if root is None:
            return True
        return self.isSymmetricHelper(root.left, root.right)
        
    def isSymmetricHelper(self, left, right):
        # 判断两个节点是否对称
        if left is None and right is None:
            return True
        if left is None or right is None or left.val != right.val:
            return False
        return self.isSymmetricHelper(left.left, right.right) and self.isSymmetricHelper(left.right, right.left)
迭代解决方案

我们也可以使用迭代的方式解决这个问题。具体步骤如下:

  1. 创建一个队列,并将根节点的左子树的左节点和右子树的右节点依次入队。
  2. 每次出队两个节点,比较它们的值是否相等。
  3. 如果相等,则将左子树的右节点和右子树的左节点入队,再将左子树的左节点和右子树的右节点入队。
  4. 重复上述步骤,直到队列为空。
  5. 如果在任何一次比较中出现节点值不相等的情况,返回 False
  6. 如果所有比较都成功,则说明树是对称的,返回 True

下面是迭代解决方案的示例代码:

from collections import deque

class Solution:
    def isSymmetric(self, root):
        if root is None:
            return True
        
        queue = deque()
        queue.append(root.left)
        queue.append(root.right)
        
        while queue:
            left = queue.popleft()
            right = queue.popleft()
            
            if left is None and right is None:
                continue
            if left is None or right is None or left.val != right.val:
                return False
            
            queue.append(left.left)
            queue.append(right.right)
            queue.append(left.right)
            queue.append(right.left)
        
        return True
总结

本文介绍了如何判断一个二叉树是否是镜像对称的,提供了递归和迭代两种解决方案。根据实际情况选择适合的方法来解决问题。希望通过这个问题的讲解,你能更好地理解和操作二叉树的相关算法。