题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
分析
一般关于二叉树的题目,第一直觉是往递归上面靠,当然了,本题适不适合还暂时不知道。
所谓镜像二叉树,举个例子
1 1
/ \ / \
2 3 ---镜像---> 3 2
/ \ / \ /\
4 5 6 6 5 4
如上图,这个二叉树就不是对称的。
1 1
/ \ / \
2 2 ---镜像---> 2 2
/ \ / \
4 4 4 4
可以看出来,对于一个节点p来说
如果它的left为空且right为空,则p的左右子树对称;
如果left不为空且right不为空,
如果left的值不等于right的值,p的左右子树不对称
否则递归检查left.left和right.right、left.right和right.left,为什么是这两对节点呢?因为作镜像操作之后,刚好right.right会落到left.left的位置,right.left会落到left.right的位置,所以只要left.left和right.right、left.right和right.left对称即可,后面的可以递归的检查下去。
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function isSymmetrical(root)
{
if (root === null)
return true;
return check(root.left, root.right);
}
function check(l, r){
if(l === null && r === null){
return true;
}
else if(l !== null && r !== null){
if(l.val !== r.val)
return false;
else
return check(l.left, r.right)&&check(l.right, r.left);
}
else{
return false;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。