剑指offer_28_对称二叉树【javascript】

90 阅读1分钟

题目

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。[1,2,2,null,3,null,3] 则不是镜像对称的。

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

示例 1:

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

示例 2:

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

限制:

  • 0 <= 节点个数 <= 1000

题解

递归

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isSymmetric = function(root) {
    return isSymmetricCore(root, root);
};
var isSymmetricCore = function(p, q){
    if (!p && !q) return true;
    if (!p || !q) return false;
    return p.val === q.val && isSymmetricCore(p.left, q.right) && isSymmetricCore(p.right, q.left);
}

复杂度分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

迭代

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isSymmetric = function(root) {
    return isSymmetricCore(root, root);
};
var isSymmetricCore = function(u, v){
   const q = [];
    q.push(u);
    q.push(v);

    while (q.length) {
        u = q.shift();
        v = q.shift();
        if (!u && !v) continue;
        if ((!u || !v) || (u.val !== v.val)) return false;
        
        q.push(u.left); 
        q.push(v.right);

        q.push(u.right); 
        q.push(v.left);
    }
    return true;
}

复杂度分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

引用

  • 剑指offer书籍
  • 力扣题解