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),递归比较两个节点:
- 两个节点都为空 → 对称,返回 true
- 一个为空一个不为空 → 不对称,返回 false
- 两个节点值不同 → 不对称,返回 false
- 值相同,继续递归比较两组"镜面对":
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 生成