给你一个二叉树的根节点 ​​root​​ , 检查它是否轴对称。

示例 1:

LeetCode 101. 对称二叉树_算法

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

LeetCode 101. 对称二叉树_leetcode_02

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 ​​[1, 1000]​​ 内
  • ​-100 <= Node.val <= 100​

进阶: 你可以运用递归和迭代两种方法解决这个问题吗?

二、方法一

递归进行判断

/**
* Definition for a binary tree node.
* public 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) {
return check(root, root);
}

public boolean check(TreeNode q, TreeNode p) {
if (q == null && p == null) {
return true;
}
if (q == null || p == null) {
return false;
}
return q.val == p.val && check(q.left, p.right) && check(q.right, p.left);
}
}

复杂度分析

  • 时间复杂度:这里遍历了这棵树,渐进时间复杂度为 O(n)。
  • 空间复杂度:这里的空间复杂度和递归使用的栈空间有关,这里递归层数不超过 n,故渐进空间复杂度为 O(n)。

三、方法二

通过队列来进行判断

/**
* Definition for a binary tree node.
* public 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 check(root, root);
}
public boolean check(TreeNode q, TreeNode p) {
Queue<TreeNode> queue = new LinkedList<>();
queue.add(q);
queue.add(p);
while (!queue.isEmpty()) {
TreeNode u = queue.poll();
TreeNode v = queue.poll();
if (u == null && v == null) {
continue;
}

if((u == null || v == null) || (u.val != v.val)) {
return false;
}
queue.add(u.left);
queue.add(v.right);
queue.add(u.right);
queue.add(v.left);
}
return true;
}
}

复杂度分析

  • 时间复杂度:O(n),同「方法一」。
  • 空间复杂度:这里需要用一个队列来维护节点,每个节点最多进队一次,出队一次,队列中最多不会超过 n 个点,故渐进空间复杂度为 O(n)。