题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
分析
一般关于二叉树的题目,第一直觉是往递归上面靠,当然了,本题适不适合还暂时不知道。 所谓镜像二叉树,举个例子
如上图,这个二叉树就不是对称的。
可以看出来,对于一个节点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; } }