剑指 Offer(21)——对称的二叉树

190 阅读2分钟

这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战

题目 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [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

思路 【分析1】首先我们需要明确一下镜像二叉树的概念,简单来说就是左子树与右子树对调。而根据树的递归定义可以,左子树和右子树的定义也是递归而言的。

【分析2】接下来我们需要明确两棵二叉树什么时候相同。显然,根结点的值相等,左右子树相同,则这两颗二叉树相同。显然,在判断两棵二叉树是否相同时也需要递归地进行判断。

【分析3】题目中并不是想让我们判断任意两棵二叉树是否相同,而是要求我们判断一棵二叉树和它的镜像二叉树是否相同。因此我们判断相同的条件不就很明显的变成了:根结点对应的值相等,原二叉树Root的左子树与其镜像二叉树Root'的右子树相同,且原二叉树Root的右子树与其镜像二叉树Root'的左子树相同。如此递归下去。直到① 如果Root和Root'均为空,则返回true;② 如果Root为空或者Root'为空,则返回false;③ 如果Root对应的值与Root'对应的值不相等,则返回false。 镜像树特点,左子树为镜像树右子树;右子树为镜像树左子树

代码

var isSymmetric = function(root) {
    if(root===null) return true
    function check(left,right){
        if(!left && !right) return true
        if(!left || !right) return false
        if(left.val !== right.val){
            return false
        } else {
            var ifTrue = check(left.left,right.right) && check(left.right,right.left)
        }
        return ifTrue
    }
    return check(root.left,root.right)
};