关注
文末的名片达文汐
,回复关键词“力扣源码”,即可获取完整源码!!详见:源码和核心代码的区别
题目详情
给你一个二叉树的根节点 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
进阶: 你可以运用递归和迭代两种方法解决这个问题吗?
解题思路
递归法:
- 核心思想:对称二叉树的左子树和右子树互为镜像。
- 递归条件:
- 当前两个节点值相等
- 左子树的左节点与右子树的右节点对称
- 左子树的右节点与右子树的左节点对称
- 终止条件:
- 两个节点都为空 → 对称
- 一个节点为空另一个非空 → 不对称
- 节点值不相等 → 不对称
迭代法:
- 核心思想:使用队列按层比较对称位置的节点。
- 操作步骤:
- 初始将根节点的左右子节点入队
- 每次从队列取出两个节点(对称位置)
- 比较节点值:不等则返回
false
- 将左节点的左子节点与右节点的右子节点入队
- 将左节点的右子节点与右节点的左子节点入队
- 终止条件:队列为空或发现不对称节点
代码实现(Java版)
递归法 (最优解)
class Solution {
public boolean isSymmetric(TreeNode root) {
return isMirror(root.left, root.right); // 比较左右子树
}
private boolean isMirror(TreeNode left, TreeNode right) {
if (left == null && right == null) return true; // 都为空:对称
if (left == null || right == null) return false; // 一个空一个非空:不对称
if (left.val != right.val) return false; // 值不相等:不对称
// 递归比较左子树的左节点与右子树的右节点,以及左子树的右节点与右子树的左节点
return isMirror(left.left, right.right) && isMirror(left.right, right.left);
}
}
迭代法
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root.left); // 左子树根节点入队
queue.add(root.right); // 右子树根节点入队
while (!queue.isEmpty()) {
TreeNode left = queue.poll(); // 取对称位置左节点
TreeNode right = queue.poll(); // 取对称位置右节点
if (left == null && right == null) continue; // 都为空:跳过
if (left == null || right == null) return false; // 一个空一个非空:不对称
if (left.val != right.val) return false; // 值不相等:不对称
// 按对称顺序入队子节点
queue.add(left.left);
queue.add(right.right);
queue.add(left.right);
queue.add(right.left);
}
return true; // 全部节点对称
}
}
代码说明
-
递归法:
- 时间复杂度:O(n),每个节点访问一次
- 空间复杂度:O(h),递归栈深度为树高(最坏情况O(n))
- 优势:代码简洁,无额外数据结构开销
-
迭代法:
- 时间复杂度:O(n),每个节点访问一次
- 空间复杂度:O(n),队列存储节点数最多为 n/2
- 适用场景:避免递归栈溢出风险,适合大规模树