LeetCode:对称二叉树

发布于:2025-05-09 ⋅ 阅读:(11) ⋅ 点赞:(0)

1、题目描述

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000] 内

  • -100 <= Node.val <= 100

进阶:你可以运用递归和迭代两种方法解决这个问题吗?

2、方法1:递归法

解题思路

递归法通过比较左右子树的对称性来判断整棵树是否对称。

步骤:

  1. 终止条件

    • 左右节点均为 null,返回 true

    • 左右节点有一个为 null,返回 false

    • 左右节点值不相等,返回 false

  2. 递归比较

    • 比较左子树的左节点与右子树的右节点。

    • 比较左子树的右节点与右子树的左节点。

  3. 返回结果:上述两个比较结果必须同时为 true

时间复杂度:O(n),空间复杂度:O(n) (调用栈)

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

private boolean isMirror(TreeNode l, TreeNode r) {
    if (l == null && r == null) return true;  // 均为空
    if (l == null || r == null) return false; // 一个为空
    if (l.val != r.val) return false;         // 值不相等
    return isMirror(l.left, r.right) && isMirror(l.right, r.left); // 递归比较
}

3、方法2:迭代法

解题思路

迭代法通过队列按层比较左右子树的对称性。

步骤:

  1. 初始化:将根节点的左右子节点入队。

  2. 循环处理队列

    • 每次取出两个节点(左子树的节点和右子树的节点)。

    • 检查是否均为 null,是则跳过。

    • 检查是否一个为 null 或值不相等,是则返回 false

    • 将左子树的左节点与右子树的右节点入队(比较外侧)。

    • 将左子树的右节点与右子树的左节点入队(比较内侧)。

  3. 返回结果:队列为空时未发现不对称,返回 true

时间复杂度:O(n),空间复杂度:O(n) (栈空间)

public boolean isSymmetric(TreeNode root) {
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root.left);
    queue.offer(root.right);
    while (!queue.isEmpty()) {
        TreeNode u = queue.poll();
        TreeNode v = queue.poll();
        if (u == null && v == null) continue;       // 均为空
        if (u == null || v == null) return false;   // 一个为空
        if (u.val != v.val) return false;           // 值不相等
        queue.offer(u.left);  // 左子树的左节点
        queue.offer(v.right); // 右子树的右节点
        queue.offer(u.right); // 左子树的右节点
        queue.offer(v.left);  // 右子树的左节点
    }
    return true;
}