101. 对称二叉树
大约 2 分钟
101. 对称二叉树
题目
描述: 给你一个二叉树的根节点 root,检查它是否轴对称。
示例: 示例 1:
输入: root = [1,2,2,3,4,4,3]
输出: true示例 2:
输入: root = [1,2,2,null,3,null,3]
输出: false解题思路
核心方法
- 递归法:判断两棵子树是否对称,即左子树的左节点与右子树的右节点值相等,左子树的右节点与右子树的左节点值相等。
- 迭代法:使用队列或栈,将对称位置的节点成对入队/入栈,然后依次比较它们的值是否相等。
算法步骤(递归法)
- 终止条件:
- 如果两个节点都为
null,返回true。 - 如果其中一个节点为
null或两个节点值不相等,返回false。
- 如果两个节点都为
- 递归比较:递归比较左子树的左节点与右子树的右节点,以及左子树的右节点与右子树的左节点。
- 返回结果:两个递归结果均为
true时,返回true,否则返回false。
代码实现
递归法(Java)
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return isSymmetric(root.left, root.right);
}
private boolean isSymmetric(TreeNode l1, TreeNode l2) {
if (l1 == null && l2 == null) return true;
if (l1 == null || l2 == null || l1.val != l2.val) return false;
boolean a = isSymmetric(l1.left, l2.right);
boolean b = isSymmetric(l1.right, l2.left);
return a && b;
}
}迭代法(Java)
import java.util.*;
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 l1 = queue.poll();
TreeNode l2 = queue.poll();
if (l1 == null && l2 == null) continue;
if (l1 == null || l2 == null || l1.val != l2.val) return false;
queue.offer(l1.left);
queue.offer(l2.right);
queue.offer(l1.right);
queue.offer(l2.left);
}
return true;
}
}复杂度分析
递归法
- 时间复杂度:
O(n),其中n是二叉树的节点数。每个节点会被访问一次。 - 空间复杂度:
O(h),h是二叉树的高度。递归栈的深度取决于树的高度,最坏情况下(链状树)为O(n)。
迭代法
- 时间复杂度:
O(n),每个节点会被入队和出队一次。 - 空间复杂度:
O(m),m是队列中最多同时存在的节点数,最坏情况下为O(n)。
总结
- 递归法通过递归比较对称位置的节点,逻辑清晰,代码简洁。
- 迭代法使用队列实现广度优先遍历,避免了递归栈溢出的风险,适合处理深度较大的树。
- 两种方法的时间效率一致,空间效率取决于树的形态,递归法受高度影响,迭代法受宽度影响。
