返回

LeetCode 101:对称二叉树

IOS

目录

给定一个二叉树的根节点,判断它是否为对称的。

一个二叉树被称为对称的,如果它左子树的镜像和右子树相同。例如,以下二叉树是对称的:

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

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

        1
       / \
      2   2
     / \   \
    3  4   3

解决这个问题的一个直观方法是使用递归。我们可以将对称检查分解为两个子问题:

  • 检查左子树是否镜像对称右子树。
  • 检查左子树的左子树是否镜像对称右子树的右子树。
  • 检查左子树的右子树是否镜像对称右子树的左子树。

如果上述所有子问题都成立,则该二叉树是对称的。否则,它是不对称的。

func isSymmetric(_ root: TreeNode?) -> Bool {
    return isMirror(root?.left, root?.right)
}

func isMirror(_ left: TreeNode?, _ right: TreeNode?) -> Bool {
    if left == nil && right == nil {
        return true
    } else if left == nil || right == nil {
        return false
    } else if left!.val != right!.val {
        return false
    }
    return isMirror(left?.left, right?.right) && isMirror(left?.right, right?.left)
}

该算法的时间复杂度为 O(N),其中 N 是树中的节点数。这是因为我们遍历了树中的每个节点一次。

空间复杂度为 O(H),其中 H 是树的高度。这是因为递归调用堆栈中的节点数最多为 H。

我们可以扩展这个算法来解决以下相关问题:

  • 判断一棵树是否是对称的,即使它的左右子树不同。
  • 判断一棵树是否是对称的,即使它的左右子树的结构不同。
  • 判断一棵树是否是对称的,即使它的左右子树的值不同。
  1. 给定一个二叉树的根节点,找出它最大的对称子树。
  2. 给定一个二叉树的根节点,判断它是否可以通过镜像其右子树来使其对称。
  3. 给定一个二叉树的根节点,找出它所有对称子树的根节点。