递归与迭代——力扣101.对称二叉树
力扣101.对称二叉树
LeetCode 101. 对称二叉树 - 递归与迭代全解析
一、题目描述
给定一个二叉树的根节点 root
,检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
提示:
- 树中节点数目范围:[1, 1000]
- 节点值范围:[-100, 100]
进阶:
- 你可以运用递归和迭代两种方法解决此问题吗?
二、思路分析
一个二叉树是对称的,当且仅当其左子树是右子树的镜像。
从根节点出发,检查左右子树是否满足:
- 左右节点值相等;
- 左节点的左子树与右节点的右子树镜像相等;
- 左节点的右子树与右节点的左子树镜像相等。
可以用 递归 或 迭代(队列或栈) 实现。
三、解法一:递归法
核心思想:
-
定义一个辅助函数
isMirror(TreeNode t1, TreeNode t2)
; -
判断 t1 和 t2 是否互为镜像:
- t1 和 t2 同时为空,返回 true;
- t1 或 t2 为空,返回 false;
- t1.val == t2.val 并且 t1.left 与 t2.right、t1.right 与 t2.left 递归镜像相等。
代码实现:
class Solution {public boolean isSymmetric(TreeNode root) {if (root == null) return true;return isMirror(root.left, root.right);}private boolean isMirror(TreeNode t1, TreeNode t2) {if (t1 == null && t2 == null) return true;if (t1 == null || t2 == null) return false;return (t1.val == t2.val)&& isMirror(t1.left, t2.right)&& isMirror(t1.right, t2.left);}
}
复杂度分析:
- 时间复杂度:O(n),每个节点访问一次;
- 空间复杂度:O(h),h 为树的高度,递归栈开销。
四、解法二:迭代法(使用队列)
核心思想:
-
利用队列存储成对的节点;
-
每次弹出一对节点
(t1, t2)
:- 若两者都为空,继续;
- 若一方为空或值不相等,返回 false;
- 将子节点按照镜像顺序入队:t1.left、t2.right;t1.right、t2.left;
-
队列为空时返回 true。
代码实现:
import java.util.LinkedList;
import java.util.Queue;class Solution {public boolean isSymmetric(TreeNode root) {if (root == null) return true;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root.left);queue.offer(root.right);while (!queue.isEmpty()) {TreeNode t1 = queue.poll();TreeNode t2 = queue.poll();if (t1 == null && t2 == null) continue;if (t1 == null || t2 == null) return false;if (t1.val != t2.val) return false;queue.offer(t1.left);queue.offer(t2.right);queue.offer(t1.right);queue.offer(t2.left);}return true;}
}
复杂度分析:
- 时间复杂度:O(n);
- 空间复杂度:O(n),队列中最多存储一层节点。
五、方法对比
方法 | 思路核心 | 是否递归 | 时间复杂度 | 空间复杂度 | 特点 |
---|---|---|---|---|---|
递归法 | 镜像递归判断 | ✅ | O(n) | O(h) | 简洁直观、易理解 |
迭代法 | 队列模拟镜像 | ❌ | O(n) | O(n) | 无递归栈,面试友好 |
六、总结
- 对称二叉树问题本质是检查左右子树是否互为镜像;
- 递归法逻辑清晰,代码简短;
- 迭代法利用队列模拟递归过程,适合面试手写;
- 两种方法时间复杂度相同,空间复杂度依赖树高或节点数。