剑指 Offer 28. 对称的二叉树

36 阅读1分钟

题目

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

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

    1
   / \
  2   2
 / \ / \
3  4 4  3`

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

    1
   / \
  2   2
   \   \
   3    3`

 

示例 1:

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

示例 2:

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

 

限制:

0 <= 节点个数 <= 1000

注意:本题与主站 101 题相同:leetcode-cn.com/problems/sy…

题解

一棵二叉树是否对称,其实就是它的左子树是否与右子树相同。

二叉树的前序遍历是根 -> 左 -> 右

二叉树的对称前序遍历是根 -> 右 -> 左

这样我们可通过比较二叉树的前序遍历与对称前序遍历的结果是否一样,如果是一样的,那么这可二叉树就是对称的。

代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isSymmetric = function(root) {
    return _isSymmetric(root, root);

    function _isSymmetric(root1, root2) {
        // root1 或者 root2 为空,说明节点相同
        if (root1 == null  && root2 == null) {
            return true;
        }
        // root1 或者 root2 有一个为空,说明不相同
        if (root1 == null || root2 == null) {
            return false;
        }
        // root1的节点值不等于 root2.节点值,说明不相同
        if (root1.val != root2.val) {
            return false;
        }
        // 递归遍历 root1的左子树与root2的右子树是否相同
        return _isSymmetric(root1.left, root2.right) 
              // root1的右子树与root2的左子树是否相同
              && _isSymmetric(root1.right, root2.left)
    }
};

原题链接

剑指 Offer 28. 对称的二叉树