题目面试
请实现一个函数,用来判断一颗二叉树是否是对称的。注意,若是一个二叉树同此二叉树的镜像是一样的,定义其为对称的。ide
如图:函数
问题分析测试
仔细观察上图的对称二叉树,咱们能够尝试着从中间线的左边和右边作一个对比,咱们先打算用递归能不能解决,嗯,能够,可是递归的前提咱们要搞明白下面所说的一种思路。动画
咱们要想到遍历,其中,前序遍历的遍历规则是根、左、右。咱们这时候灵机一动,咱们对于对称二叉树来讲,咱们把规则变一下,变成根、右、左。若是此时是对称二叉树的话,这两种遍历的结果是相等的。不然,则不是对称二叉树。code
PS:可是有种状况除外,尽管不是对称二叉树,遍历的结果也是相同的,节点缺失的状况。以下图:blog
动画实现递归
解决思路ip
首先,传入二叉树,判断传入的二叉树是否为空节点。it
1const isSymmetrical = (root)=>{ 2 // 判断根节点是否为空 3 if(root == null){ 4 return true; 5 } 6 return Symmetric(root.left,root.right); 7}
而后开始传入一个函数,对比对称的节点值是否相同,可是咱们要想到若是节点为空的状况。
若是两个节点同时为空,咱们断定为它是对称的节点。若是其中一个为空其中一个不为空,则两个节点不对称。
1 // 判断左右子树是否为空 2 if(left == null && right == null){ 3 return true; 4 } 5 6 // 其中一个子节点是空 7 if(left == null || right == null){ 8 return false; 9 }
若是两个对称节点不为空的话,咱们就比较两个对称节点的值是否相同。
1 // 判断两个节点的值是否相同 2 if(left.data == right.data){ 3 return true; 4 }
而后咱们开始对剩下的节点进行递归遍历判断是否为对称节点。
1// 递归判断 2 return Symmetric(left.left,right.right) && Symmetric(left.right,right.left);
代码实现
JavaScript
Java
Python
测试用例