动画:面试必刷之对称的二叉树

动画:面试必刷之对称的二叉树

题目面试

请实现一个函数,用来判断一颗二叉树是否是对称的。注意,若是一个二叉树同此二叉树的镜像是一样的,定义其为对称的。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

动画:面试必刷之对称的二叉树

测试用例

  • 对称二叉树、不对称二叉树(结点数量不对称、结点结构不对称) —— 普通测试
  • 全部结点值都相同的二叉树 —— 特殊测试
  • 空二叉树 —— 输入测试
相关文章
相关标签/搜索