每日一题--对称二叉树

135 阅读2分钟

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

题目


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

 

示例 1:

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

示例 2:

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

提示:

树中节点数目在范围 [1, 1000] 内 -100 <= Node.val <= 100

思路


乍一看无从下手,但用递归其实很好解决。

根据题目的描述,镜像对称,就是左右两边相等,也就是左子树和右子树是相当的。

注意这句话,左子树和右子相等,也就是说要递归的比较左子树和右子树。

我们将根节点的左子树记做 left,右子树记做 right。比较 left 是否等于 right,不等的话直接返回就可以了。

如果相当,比较 left 的左节点和 right 的右节点,再比较 left 的右节点和 right 的左节点

比如看下面这两个子树(他们分别是根节点的左子树和右子树),能观察到这么一个规律:

左子树 22 的左孩子 == 右子树 22 的右孩子

左子树 22 的右孩子 == 右子树 22 的左孩子

根据上面信息可以总结出递归函数的两个条件: 终止条件:

left 和 right 不等,或者 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) {
    if(!root) return true
    function compare(left,right){
        if(!left && !right) return true
        if(!left || !right) return false
        if(left.val !== right.val) return false
        return compare(left.left,right.right) && compare(left.right,right.left)
    }
    return compare(root.left,root.right)
};

算法的时间复杂度是 O(n)O(n),因为要遍历 nn 个节点 空间复杂度是 O(n)O(n),空间复杂度是递归的深度,也就是跟树高度有关,最坏情况下树变成一个链表结构,高度是nn。