LeetCode-101. 对称二叉树

题目描述

给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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

链接:https://leetcode-cn.com/problems/symmetric-tree

我的AC代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
let arrIsSymmetric = function (arr) {
    for(let i = 0, j = arr.length -1; i < j; i++, j--) {
        if (arr[i] !== arr[j]) {
            return false;
        }
    }
    return true;
}

方法四:递归,使用二维数组存放遍历结果,然后判断每一层的遍历数组是否对称
/* var isSymmetric = function(root) {
    if(!root){return true;}
    let res = [];
    var traverse = function(root, level) {
        if(res[level]) {
            res[level].push(root ? root.val : null);
        }
        else {
            res[level] = [root ? root.val : null];
        }
        if (root) {
            traverse(root.left, level + 1);
            traverse(root.right, level + 1);
        }
    }
    traverse(root, 0);
    for (let i = 0; i < res.length; i++) {
        if (!arrIsSymmetric(res[i])) {
            return false
        }
    }
    return true;
}; */

// 方法三:迭代,判断每一层的遍历数组是否对称,不同层使用特殊字符进行分割
/* var isSymmetric = function(root) {
    if (!root) {
        return true;
    }
    let arr = [root, 'd'];
    let currentLevelArr = [];
    while(arr.length) {
        let ele = arr.shift();
        if (arr.length === 0 && ele === 'd') {
            break;
        }
        if (ele === 'd') {
            arr.push('d');
            if (!arrIsSymmetric(currentLevelArr)) {
                return false;
            }
            currentLevelArr = [];
            continue;
        }
        else {
            currentLevelArr.push(ele ? ele.val : null);
            if (ele) {
                arr.push(ele.left);
                arr.push(ele.right);
            }
        }
    }
    return true;
} */

// 方法二:递归,判断对称位置节点的左子树与右子树是否对称
/* var isMirror = function(a, b) {
    if (a === null && b=== null) {
        return true;
    }
    if (a === null || b === null) {
        return false;
    }
    if (a.val === b.val) {
        return isMirror(a.left, b.right) && isMirror(b.left, a.right)
    }
    else {
        return false;
    }
}

var isSymmetric = function(root) {
    return isMirror(root, root);
} */

// 方法一:迭代,从左到右遍历与从右遍历的的顺序应该是一致的
var isSymmetric = function(root) {
    let q = [root];
    let p = [root];
    while(q.length) {
        let qEle = q.shift();
        let pEle = p.shift();
        if (qEle === null && pEle === null) {
            continue;
        }
        if (qEle === null || pEle === null) {
            return false;
        }
        if (pEle.val !== qEle.val) {
            return false;
        }
        q.push(qEle.left);
        q.push(qEle.right);
        p.push(pEle.right);
        p.push(pEle.left);
    }
    return true;
}

题解

方法1: 迭代,从左到右遍历与从右遍历的的顺序应该是一致的

使用队列的方法,用两个队列,一个从左到右遍历,一个从右到左遍历,如果二叉树的平衡的话,那么队列中的元素应该是一致的。时间复杂度O(n),空间 复杂度O(n)

方法2:递归,判断对称位置节点的左子树与右子树是否对称

使用递归的方法,判断对应位置的节点值是否相等,不相等则不对称,相等则判断两个位置的左子树和右子树是否对称。 时间复杂度O(n),空间复杂度O(n)

方法3: 迭代,判断每一层的遍历数组是否对称,不同层使用特殊字符进行分割

方法4: 递归,使用二维数组存放遍历结果,然后判断每一层的遍历数组是否对称

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。