题目

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

如图:


问题分析

仔细观察上图的对称二叉树,我们可以尝试着从中间线的左边和右边做一个对比,我们先打算用递归能不能解决,嗯,可以,但是递归的前提我们要搞明白下面所说的一种思路。

我们要想到遍历,其中,前序遍历的遍历规则是根、左、右。我们这时候灵机一动,我们对于对称二叉树来说,我们把规则变一下,变成根、右、左。如果此时是对称二叉树的话,这两种遍历的结果是相等的。否则,则不是对称二叉树。

PS:但是有种情况除外,尽管不是对称二叉树,遍历的结果也是相同的,节点缺失的情况。如下图:

动画实现

解决思路

首先,传入二叉树,判断传入的二叉树是否为空节点。

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    }56    // 其中一个子节点是空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

测试用例

  • 对称二叉树、不对称二叉树(结点数量不对称、结点结构不对称) —— 普通测试
  • 所有结点值都相同的二叉树 —— 特殊测试
  • 空二叉树 —— 输入测试
©著作权归作者所有:来自51CTO博客作者mb5fe1601ede528的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 动画:面试算法之求二叉树的下一节点
  2. PHP使用递归按层级查找数据(代码详解)
  3. PHP递归算法的应用(含示例)
  4. 什么是php递归
  5. php+nodeJs+thrift协议,实现zookeeper节点数据自动发现
  6. php递归经典案例

随机推荐

  1. android拖动图片移动效果
  2. [置顶] Android中显示AlertDialog对话框
  3. android ftp服务器实现
  4. 监听Bluetooth
  5. android ClassNotFoundException: Didn't
  6. Android(安卓)执行 FFmpeg 命令
  7. Android——intent分享图片到微信好友、
  8. android的ImageSwitcher和TextSwitcher
  9. android 自定义 radiobutton 文字颜色随
  10. Android 海贼王连连看游戏源码