1. 题目描述

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

  1. 1
  2. / \
  3. 2 2
  4. / \ / \
  5. 3 4 4 3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

  1. 1
  2. / \
  3. 2 2
  4. \ \
  5. 3 3

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

2. 解题思路

(1)递归:
递归的思路比较简单,具体实现思路如下:

  • 首先判断当前树是否为空,空则直接返回true,否则就左子树的左子树和右子树的右子树是否相等
  • 如果左节点或者右节点为空时,就比较对应的右节点或左节点是否为空,为空则返回true,否则就返回false
  • 如果左右节点都不为空,就判断左节点的左节点和右节点的右节点是否相等
  • 如果相等,就传入该节点的子节点进行递归,否则就返回false

递归的时间复杂度为O(n),空间复杂度为O(n)。

(2)迭代:
迭代方法需要借助队列来实现。

迭代的时间复杂度为O(n),空间复杂度为O(n)。

3. 代码实现

递归:

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val) {
  4. * this.val = val;
  5. * this.left = this.right = null;
  6. * }
  7. */
  8. /**
  9. * @param {TreeNode} root
  10. * @return {boolean}
  11. */
  12. var isSymmetric = function(root) {
  13. if(!root){
  14. return true
  15. }
  16. return isSameTree(root.left, root.right)
  17. };
  18. const isSameTree = (l, r) => {
  19. if(!l) return r === null
  20. if(!r) return l === null
  21. if(l.val !== r.val) return false
  22. return isSameTree(l.left, r.right,) && isSameTree(l.right, r.left)
  23. }

迭代:

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val) {
  4. * this.val = val;
  5. * this.left = this.right = null;
  6. * }
  7. */
  8. /**
  9. * @param {TreeNode} root
  10. * @return {boolean}
  11. */
  12. const isSymmetric = (root) => {
  13. if (!root) return true
  14. let queue = [root.left, root.right]
  15. while (queue.length > 0) {
  16. let t1 = queue.shift(), t2 = queue.shift()
  17. if (t1 === null && t2 === null) continue
  18. if (t1 === null || t2 === null || t1.val !== t2.val) return false
  19. queue.push(t1.left, t2.right, t1.right, t2.left)
  20. }
  21. return true
  22. }

4. 提交结果

递归:
101. 对称二叉树 - 图1
迭代:
101. 对称二叉树 - 图2