其他分享
首页 > 其他分享> > 动画:面试必刷之对称的二叉树

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

作者:互联网

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

题目

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

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


问题分析

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

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

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    }
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

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

测试用例

标签:动画,right,return,二叉树,对称,必刷,节点,left
来源: https://blog.51cto.com/15064450/2601470