力扣100——对称二叉树

64 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

力扣100——对称二叉树

题目

对称二叉树是力扣当中的一道简单题,题目是:给定一个二叉树,判断其是否为对称二叉树。首先,我们需要搞懂,什么叫对称二叉树。对称二叉树是从根节点出发,左右两个子树的节点相同,比如左子树的左节点和右子树的右节点相等,那么这两个节点就是对称的。

我们需要求解的就是判断给定的二叉树是否为对称二叉树。那么我们该如何解题呢?

解题思路

在解这道题之前,我们需要思考这道题可以使用什么方法来解,说起二叉树,我们首先想到的就是递归与迭代,因为我们在二叉树的便利当中经常使用这两种方法来进行遍历。这里也不例外,我们这里使用递归的方法来进行求解。首先我们需要判断给我们的子树是否为null,如果根节点为null,那么我们直接返回true,如果根节点不为null,那么我们要对根节点的左右子树进行判断,如果他们全部为null,那么也是对称的,如果他们有一个为null,另外一个不为null那么就是不对称的,我们直接返回false。接下里我们要判断值是否相等,值相等,返回true,值不相等,返回false。依次类推,我们对左右子树进行递归操作。

代码

/**
 * 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) {
    // 判断root根节点是否为null
    if(root === null){
        return true;
    }

    // 返回左右子树比较后的结果
    return subSym(root.left,root.right);

    // 判断左右子树是否对称
    function subSym(left,right){

        // 如果左节点为空并且右节点也为空,那么两个子树对称,返回true
        if(left === null && right === null){
            return true;
        }

        // 如果左节点为null或右自节点为null,或左节点的值不等于右节点的值,则返回false
        if(left === null || right === null || left.val !== right.val){
            return false;
        }
        // 将左子树的左节点和右子树的右节点进行比较
        const isLeft = subSym(left.left,right.right);
        // 将右子树的左节点和左子树的右节点进行比较
        const isRight = subSym(left.right,right.left);
        
        // 返回两个子树的比较结果
        return isLeft && isRight;
    }
};