【树】C007_对称二叉树(迭代 | 递归)

一、题目描述

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
the following [1,2,2,null,3,null,3] is not symmetric:

    1
   / \
  2   2
   \   \
   3    3

二、题解

方法一:队列迭代

别人都说递归容易,对于这题,我觉得用迭代更加简单。由于对称树是二叉的,所以,队列中每两个连续的结点必然相等的。

  • 每次我们只需添加每个结点的左右孩子结点。
  • 有可能孩子两个连续的结点都是空的,所以这种情况不必继续判断。下面就判断对称二叉树的性质即可:
    • 两个结点要么全空,不能只空一个。
    • 两个根结点都不空时应该具有相同的 val。
public boolean isSymmetric1(TreeNode root) {

  LinkedList<TreeNode> queue = new LinkedList<>();
  queue.add(root);
  queue.add(root);
  
  while (!queue.isEmpty()) {
    TreeNode n1 = queue.poll();
    TreeNode n2 = queue.poll();
    
    if (n1 == null && n2 == null) continue;
    if (n1 == null || n2 == null) return false;
    if (n1.val != n2.val)         return false;

    queue.add(n1.left);
    queue.add(n2.right);
    queue.add(n1.right);
    queue.add(n2.left);
  }
  return true;
}

复杂度分析

  • 时间复杂度: O ( n ) O(n)
  • 空间复杂度: O ( 1     n ) O(1\ 或\ n)

方法二:递归

按照递归三部曲,我们应该这样做:

方法结束条件:

  • 都为空指针则返回 true

返回值:

  • 只有一个为空则返回 false

本层递归的责任:

  • 判断结点 1 的右子树与结点 2 的左子树是否对称
  • 判断结点 1 的左子树与结点 2 的右子树是否对称
public boolean isSymmetric(TreeNode root) {
  if (root == null)
    return true;
  
  return isMirror(root.left, root.right);
}

private boolean isMirror(TreeNode l, TreeNode r) {

  if (l == null && r == null)
    return true;

  if (l == null || r == null)
    return false;

  return l.val == r.val &&
          isMirror(l.left, r.right) && isMirror(l.right, r.left);
}

复杂度分析

  • 时间复杂度: O ( n ) O(n)
  • 空间复杂度: O ( 1     n ) O(1\ 或\ n)
发布了419 篇原创文章 · 获赞 94 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43539599/article/details/104532680