判断对称二叉树

标签: 深度优先搜索 广度优先搜索 二叉树

难度: Easy

请设计一个函数判断一棵二叉树是否 轴对称

示例 1:

输入:root = [6,7,7,8,9,9,8]
输出:true
解释:从图中可看出树是轴对称的。

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false
解释:从图中可看出最后一层的节点不对称。

提示:

0 <= 节点个数 <= 1000

注意:本题与主站 101 题相同:https://leetcode-cn.com/problems/symmetric-tree/

Submission

运行时间: 40 ms

内存: 15.1 MB

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        def recur(l, r):
            if l is None and r is None:
                return True
            if l is None or r is None:
                return False
            return l.val == r.val and recur(l.left, r.right) and recur(l.right, r.left)

        return root is None or (recur(root.left, root.right))

Explain

该题解采用递归的方法判断二叉树是否轴对称。首先,如果树为空,则认为它是对称的。对于非空树,判断其左右子树是否对称。定义一个递归函数 recur(l, r),其中 l 和 r 分别代表两个待比较的节点。该函数的逻辑如下:如果 l 和 r 都为空,则返回 True;如果其中一个为空而另一个不为空,则返回 False;否则,比较 l 和 r 的值是否相等,且递归地比较 l 的左子树和 r 的右子树是否对称,以及 l 的右子树和 r 的左子树是否对称。

时间复杂度: O(n)

空间复杂度: O(n)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        def recur(l, r):
            if l is None and r is None:
                return True
            if l is None or r is None:
                return False
            return l.val == r.val and recur(l.left, r.right) and recur(l.right, r.left)

        return root is None or (recur(root.left, root.right))

Explore

在判断对称二叉树的递归过程中,节点值的相等是对称性要求的基础。如果两个对应位置的节点值不等,则已经违反了对称性原则,因此无需再考虑其子节点。对称性的检查是从顶部到底部进行的,一旦在任何级别发现不对称,整个树都不对称。

空树认为是对称的这一假设主要是基于对称性定义——空树没有元素可比较,自然符合对称的要求。这种假设不适用于所有二叉树相关的问题,例如在其他类型的问题中,空树可能需要特殊处理或有其他含义。所以,这是对称性问题特有的处理方式。

递归函数recur(l, r)的停止条件有两种:第一种是当比较的两个节点l和r都为空时,返回True,表示这部分子树是对称的;第二种是当其中一个节点为空而另一个不为空,或节点值不相等时,返回False,表示找到不对称的证据,递归终止。这些条件确保了只有当所有对应位置的节点都符合对称要求时,整棵树才是对称的。

这种处理方式是基于对称二叉树的定义:树的左子树是右子树的镜像。因此,在递归函数中,左节点的左子树应与右节点的右子树相对称,左节点的右子树应与右节点的左子树相对称。这是根据对称性的定义和镜像反射的原则来决定的,确保了每一层的节点都按照对称规则进行比较。