Leetcode 101 对称二叉树:递归

文章内容

https://leetcode.cn/problems/symmetric-tree/

一、题目解析

给定一棵二叉树的根节点 root,判断它是否是轴对称的。轴对称的二叉树,它的左子树和右子树互为镜像——左子树的每个节点与右子树对应位置的节点值相等,且结构对称。

以 [1,2,2,3,4,4,3] 为例:

plain text
        1     /     \    2       2   / \     / \  3   4   4   3

左子树的 3 对应右子树的 3,左子树的 4 对应右子树的 4,结构和值都对称,返回 true。

二、递归思路

判断一棵树是否对称,等价于判断它左右子树的根节点是否"镜像相等"。定义辅助函数 isSymmetricHelper(left, right),递归比较两个节点:

  1. 两个节点都为空 → 对称,返回 true
  2. 一个为空一个不为空 → 不对称,返回 false
  3. 两个节点值不同 → 不对称,返回 false
  4. 值相同,继续递归比较两组"镜面对":
    • left.left 与 right.right(外侧)
    • left.right 与 right.left(内侧)

两组都对称,当前这对节点才对称。

关键点在于递归的比较方向是交叉的——不是比较 left.left 和 right.left,而是 left.left 和 right.right。这正是"镜像"的含义:左右互换。

对称二叉树递归镜像比较

三、代码实现

java
class Solution {    // 递归比较两个节点是否镜像对称    private boolean isSymmetricHelper(TreeNode left, TreeNode right) {        // 两个都为空 → 对称        if (left == null && right == null) {            return true;        }        // 一个为空 → 不对称        if (left == null && right != null) {            return false;        }        if (left != null && right == null) {            return false;        }        // 值不同 → 不对称        if (left.val != right.val) {            return false;        }        // 值相同,递归比较外侧和内侧        return isSymmetricHelper(left.left, right.right)            && isSymmetricHelper(left.right, right.left);    }     public boolean isSymmetric(TreeNode root) {        // 空树视为对称        if (root == null) {            return true;        }        // 比较根节点的左右子树        return isSymmetricHelper(root.left, root.right);    }}

时间复杂度 O(n),每个节点访问一次。空间复杂度 O(h),h 为树高,递归栈深度。


本文由 AgentPlanFlow 生成

觉得不错?给作者点个赞吧

分类:题解

评论 (0)

无需注册,留言经站长审核后公开。

加载评论中…

Leetcode 101 对称二叉树:递归 · Yinchen 的博客