给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
思路:一棵树root,怎么判断它是不是对称的呢?如果这棵树为空,那就直接是对称的。如果左右子树都存在呢?发现,如果一棵树是镜像对称的,那么,它的左子树和右子树是互为对称的。所以,把问题转化为:如何判断两颗树r1,r2是互为对称的呢?
必须要满足三个条件:1. 这两棵树的顶点的值必须相等。2. r1的左子树和r2的右子树应该是互为对称的 3. r1的右子树和r2的左子树应该是互为对称的
那么我们发现,判断两棵树是否对称,需要用到他们的子树是否对称,所以用递归来写。
var isSymmetric = function(root) {
if(!root){return true}
return check(root.left,root.right)
function check(r1,r2){
if(!r1 && !r2){
return true
}else if(r1 && r2){
return r1.val===r2.val && check(r1.left,r2.right) && check(r1.right,r2.left)
}else{
return false
}
}
};
先定义一个check函数,用于递归地判断传进去的两棵树是否互为对称。递归地终止条件就是,这两棵树都是空的,那么自然就是对称的。如果都不为空,那就要递归。如果只有一个为空,那就肯定不对称,因为对着的位置是空的。
100. 相同的树
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
1 1
/ \ / \
2 3 2 3
[1,2,3], [1,2,3]
输出: true
示例 2:
输入: 1 1
/ \
2 2
[1,2], [1,null,2]
输出: false
示例 3:
输入: 1 1
/ \ / \
2 1 1 2
[1,2,1], [1,1,2]
输出: false
和上边的题思路类似。如何判断两棵树p,q是否相同?如果p,q都存在,首先必须满足p,q自己的值相等;而且,p的左孩子和q的左孩子是相同的;而且,p的右孩子和q的右孩子是相同的。 怎么判断p,q的左孩子相同呢?又回到了判断两棵树是否相同的问题。所以还是递归。递归的终止条件就是:如果某一次的p,q全为空,返回true。如果某次的p,q只有一个为空,就返回false;如果都不为空,就按照递归去判断。
var isSameTree = function(p, q) {
if(!p && !q){
return true
}else if(p && q){
return p.val===q.val && isSameTree(p.left,q.left) && isSameTree(p.right,q.right)
}else{
return false
}
};