返回

镜像中的二叉树,探索对称之美

前端

算法的艺术:寻找对称的二叉树

计算机科学的艺术很大程度上在于解决问题的创造性和优雅性,就像寻找对称二叉树一样。这种特殊的二叉树拥有独特的镜像特性,使得算法的魅力被展现得淋漓尽致。本文将带领您开启一场探索对称二叉树的算法之旅,旨在以优雅简洁的代码展现算法之美。

算法设计:左右对称的启示

对称二叉树的算法设计源自一个简单的观察:如果将一棵对称的二叉树镜像,那么它将与原本的二叉树完全相同。因此,我们可以通过比较二叉树的左子树与右子树是否对称来判断整棵二叉树是否对称。这个观察为我们提供了一个算法设计的灵感,我们将算法的实现过程分为两步:

  1. 检查根节点是否相同: 我们将根节点作为比较的起点,检查它的左右子树是否对称。如果根节点的左子树与右子树是对称的,那么整棵二叉树就是对称的。
  2. 递归地检查左右子树是否对称: 如果根节点的左右子树不对称,那么整棵二叉树就不会是对称的。此时,我们将算法递归地应用于左子树和右子树,继续检查它们是否对称。

通过这两步,我们就可以判断一棵二叉树是否对称。算法的本质在于将问题分解成更小的子问题,并使用递归的方法解决它们。

代码实现:展现算法的优雅

def is_symmetric(root):
    """
    判断一棵二叉树是否对称
    
    Args:
        root (TreeNode): 二叉树的根节点
    
    Returns:
        bool: 二叉树是否对称
    """

    if not root:
        return True

    return is_symmetric_helper(root.left, root.right)


def is_symmetric_helper(left, right):
    """
    判断两个二叉树是否对称
    
    Args:
        left (TreeNode): 第一个二叉树的根节点
        right (TreeNode): 第二个二叉树的根节点
    
    Returns:
        bool: 两个二叉树是否对称
    """

    if not left and not right:
        return True

    if not left or not right:
        return False

    if left.val != right.val:
        return False

    return is_symmetric_helper(left.left, right.right) and is_symmetric_helper(left.right, right.left)

算法的实现中,我们使用了辅助函数is_symmetric_helper()来比较两个二叉树是否对称。这个函数使用递归的方法,不断地比较两个二叉树的左右子树是否对称,最终返回两个二叉树是否对称的结果。主函数is_symmetric()则使用辅助函数来判断整棵二叉树是否对称,如果辅助函数返回True,则整棵二叉树是