101. 对称二叉树(Python)

更多题目移步【力扣简单题】

题目

难度:★☆☆☆☆
类型:二叉树

给定一个二叉树,检查它是否是镜像对称的。

示例

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

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

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
    \   \
    3    3

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

解答

这道题和【100.相同的树】很类似,我们可以使用递归和队列两种方式实现。

方案1:递归

对称的树的左子树和右子树满足以下条件:

  1. 如果左子树或右子树均为空,则该树对称;

  2. 如果左子树或右子树只有一个为空,则该树不对称;

  3. 如果左子树和右子树均不为空,当左子树的左子树和右子树的右子树镜像对称,且左子树的右子树和右子树的左子树镜像对称时,该树对称。

class Solution:
    def isSymmetric(self, root):
        """
        递归
        :param root:
        :return:
        """
        def is_mirror(p, q):         # 判断左右子树是否镜像对称
            if not p and not q:
                return True
            elif not p and q or p and not q:
                return False
            else:
                return p.val == q.val and is_mirror(p.left, q.right) and is_mirror(p.right, q.left)

        return is_mirror(root, root)

方案2:队列

  1. 对根节点进行非空判断,将根节点的左右子树放在一个队列中;

  2. 每次成对取出节点,这两个节点其实是二叉树的对称位置,判断这两个节点的相等情况:
    (1)如果两结点均为空,则继续下一轮循环;
    (2)如果两结点只有一个是空,直接返回Fasle;
    (3)如果两结点都不为空,且它们的数值不同,也直接返回False;
    (4)此时两结点的数值一定相等,将它们的左右子结点逆序加入到队列中,保证每一对结点都是对称的位置。

  3. 如果到最后,队列中为空,则二叉树对称,返回True。

class Solution:
    def isSymmetric(self, root):
        """
        队列
        :param root:
        :return:
        """

        if not root:
            return True

        node_queue = [root.left, root.right]    # 在空队列中加入左子树和右子树

        while node_queue:
            left = node_queue.pop(0)            # 依次弹出两个元素
            right = node_queue.pop(0)

            if not right and not left:          # 如果均为空,继续下一个循环
                continue
            if not right or not left:           # 如果只有一个为空,返回False
                return False

            if left.val != right.val:           # 都非空,再判断值是否相等
                return False

            node_queue.append(left.left)        # 将两个左右子树的左右子树逆序加入队列
            node_queue.append(right.right)
            node_queue.append(left.right)
            node_queue.append(right.left)

        return True

如有疑问或建议,欢迎评论区留言~

你可能感兴趣的:(101. 对称二叉树(Python))