📜  检查两棵二叉树是否镜像 |设置 3(1)

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

检查两棵二叉树是否镜像
介绍

在二叉树的数据结构中,两棵二叉树被称为镜像(或对称),当且仅当它们互为镜像。也就是说,一棵树的左子树与另一棵树的右子树相等,同时一棵树的右子树与另一棵树的左子树相等。本文将介绍如何检查两棵二叉树是否镜像。

问题描述

给定两棵二叉树,编写一个函数来判断它们是否是镜像的。

方法

递归法:

通过递归遍历两棵二叉树的对应节点,判断它们的值是否相等,并且左子树与右子树分别对称。如果两棵树都为空,则为镜像。如果一棵树为空,而另一棵树不为空,则不是镜像。如果两棵树的当前节点不相等,则不是镜像。

算法步骤:

  1. 如果两棵树的根节点都为空,则返回 true。
  2. 如果只有一棵树为空,而另一棵树不为空,则返回 false。
  3. 递归判断两棵树的左子树和右子树是否是镜像的,即调用递归函数判断 isMirror(root1.left, root2.right)isMirror(root1.right, root2.left)
  4. 判断当前节点的值是否相等,如果不相等则返回 false。
  5. 如果以上所有条件都满足,则返回 true。

迭代法:

利用队列保存需要比较的节点。开始时将两棵树的根节点加入队列中,然后比较队列中的两个节点,如果它们的值不相等,则不是镜像。然后按照镜像的对称关系将节点加入队列,并继续比较队列中的节点,直到全部节点比较完成。如果最后队列为空,则是镜像。

算法步骤:

  1. 如果两棵树的根节点都为空,则返回 true。
  2. 如果只有一棵树为空,而另一棵树不为空,则返回 false。
  3. 创建一个队列,并将两棵树的根节点加入队列中。
  4. 循环使用队列,并取出队列中的两个节点,比较它们的值是否相等,如果不相等则返回 false。
  5. 依次将两个节点的左子节点和右子节点按照镜像的对称关系加入队列中。
  6. 如果以上所有条件都满足,并且队列为空,则返回 true。
代码实现

递归法

def isMirror(root1, root2):
    if root1 is None and root2 is None:
        return True
    if root1 is None or root2 is None:
        return False
    
    return (root1.val == root2.val 
            and isMirror(root1.left, root2.right) 
            and isMirror(root1.right, root2.left))

迭代法

from collections import deque

def isMirror(root1, root2):
    queue = deque([(root1, root2)])
    
    while queue:
        node1, node2 = queue.popleft()
        
        if node1 is None and node2 is None:
            continue
        if node1 is None or node2 is None:
            return False
        if node1.val != node2.val:
            return False
        
        queue.append((node1.left, node2.right))
        queue.append((node1.right, node2.left))
    
    return True
复杂度分析
  • 递归法:
    • 时间复杂度:假设树的节点数为 n,需要遍历两棵树的所有节点,所以时间复杂度是 O(n)。
    • 空间复杂度:递归调用栈的最大深度为树的高度,最坏情况下,树是一棵单链树,高度为 n,所以空间复杂度是 O(n)。
  • 迭代法:
    • 时间复杂度:假设树的节点数为 n,遍历两棵树的所有节点需要 O(n) 的时间,所以时间复杂度是 O(n)。
    • 空间复杂度:迭代过程中使用的队列的最大长度是树的广度优先遍历的最大层级节点数,最坏情况下是树的叶子节点,所以空间复杂度是 O(n)。