leetcode
leetcode 2551 ~ 2600
判断对称二叉树

判断对称二叉树

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 40 ms, 内存: 15.1 MB


/*
* 思路:
* 1. 若根节点为空,则树是对称的。
* 2. 使用递归和Java Stream API来比较树的左右子树是否对称。
* 3. 定义一个辅助函数isMirror,比较两棵树是否镜像。
*    - 若两个节点都为空,返回true。
*    - 若一个为空一个不为空,返回false。
*    - 若两个节点的值相等,递归比较左节点的左子树和右节点的右子树,
*      以及左节点的右子树和右节点的左子树。
*/
import java.util.stream.Stream;

public class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) return true;
        return isMirror(root.left, root.right);
    }

    private boolean isMirror(TreeNode left, TreeNode right) {
        return Stream.of(left, right)
                .allMatch(node -> node == null) ||
               (left != null && right != null && left.val == right.val
                        && isMirror(left.left, right.right)
                        && isMirror(left.right, right.left));
    }
}

解释

方法:

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

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在递归函数中,当两个节点值不相等时,直接返回False,但未考虑其子节点的情况。为什么可以这样做?
在判断对称二叉树的递归过程中,节点值的相等是对称性要求的基础。如果两个对应位置的节点值不等,则已经违反了对称性原则,因此无需再考虑其子节点。对称性的检查是从顶部到底部进行的,一旦在任何级别发现不对称,整个树都不对称。
🦆
题解中提到如果树为空则认为它是对称的。这种假设是否适用于所有二叉树相关的问题,或者这是对称性特有的?
空树认为是对称的这一假设主要是基于对称性定义——空树没有元素可比较,自然符合对称的要求。这种假设不适用于所有二叉树相关的问题,例如在其他类型的问题中,空树可能需要特殊处理或有其他含义。所以,这是对称性问题特有的处理方式。
🦆
题解提到的递归函数recur(l, r)考虑了节点值相等并递归比较子树,但未明确说明递归停止的条件是什么。是否可以更详细地解释递归终止的条件?
递归函数recur(l, r)的停止条件有两种:第一种是当比较的两个节点l和r都为空时,返回True,表示这部分子树是对称的;第二种是当其中一个节点为空而另一个不为空,或节点值不相等时,返回False,表示找到不对称的证据,递归终止。这些条件确保了只有当所有对应位置的节点都符合对称要求时,整棵树才是对称的。
🦆
题解中递归函数处理节点的方式是左节点的左子树对比右节点的右子树,左节点的右子树对比右节点的左子树。这种选择有没有特定的理由或是根据什么原则来的?
这种处理方式是基于对称二叉树的定义:树的左子树是右子树的镜像。因此,在递归函数中,左节点的左子树应与右节点的右子树相对称,左节点的右子树应与右节点的左子树相对称。这是根据对称性的定义和镜像反射的原则来决定的,确保了每一层的节点都按照对称规则进行比较。

相关问题