“这是我参与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)
};