LeetCode 👉 HOT 100 👉 对称二叉树 - 中等题

329 阅读2分钟

「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」。

题目

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例1

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

输出:true

示例2

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

输出:false

思路

先思考简单的情况,例如示例1,如果一颗二叉树是轴对称的,那么除根节点外,根节点的两个左右子树 left, right,必须根节点的数值相等,且存在这样一个关系:left.left 需要和 right.right 相比较,left.right 需要和 right.left 比较;如果把 left.left 想像为 newLeft,把 right.right 想像为 newRight,那么其实就重复了比较的第一步,其实就是一个递归比较的过程。

定义一个函数 checkNode(left, right),接收两个子树,进行比较。

  • 两个子树都为空,认为两个子树是相等的

  • 存在一个子树为空,另一个不为空时,认为两颗子树不相等

  • 两个子树的根节点数值不相等,认为两颗子树不相等

  • 剩下情况,需要将 left.left、right.right, left.right、right.left 俩俩比较,重复上述过程

递归完整代码如下

    /**
     * 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) {
        
        const checkNode = (left, right) => {

            if(left === null && right !== null || left !== null && right === null) {
                return false;
            } else if(left === null && right === null) {
                return true;
            } else if(left.val != right.val) {
                return false;
            }

            // 剩下的就是 左右子树存在,且根节点数值相等,需要继续比较子树
            return checkNode(left.left, right.right) && checkNode(left.right, right.left)
        }

        if(root === null) {
            return true;
        }

        return checkNode(root.left, root.right);
    };

小结

递归求解,是处理二叉树比较好的方式,但需要找清楚递归的方向。

LeetCode 👉 HOT 100 👉 对称二叉树 - 中等题

合集:LeetCode 👉 HOT 100,有空就会更新,大家多多支持,点个赞👍

如果大家有好的解法,或者发现本文理解不对的地方,欢迎留言评论 😄