1、题目描述
【JZ58】请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
知识点:二叉树,递归
难度:☆
2、解题思路
根据题意中对称二叉树的定义,我们可以采用递归的思路来解决。
根据上图可知:若满足对称二叉树,必须满足:
1、L 和 R 相同;
2、L->left 和 R->right 相同;
3、L->right 和 R->left 相同。
根据这种规律,我们可以从根节点开始往下遍历。
1、先对比 root 和 root,肯定相同。
2、接着对比 root.left 和 root.right,如果不相同,则直接返回 false;如果相同,则继续对比 left.left 和 right.right 是否相同,left.right 和 right.left 是否相同。
3、当需要对比是否相同的两个节点同时为 null,返回 true;不同时为 null,则返回 false。
3、解题代码
package pers.klb.jzoffer.veryhard;
import pers.klb.jzoffer.simple.TreeNode;
/**
* @program: JzOffer2021
* @description: 对称的二叉树
* @author: Meumax
* @create: 2020-08-12 19:28
**/
public class SymmetricalTree {
boolean isSymmetrical(TreeNode pRoot) {
return isSame(pRoot,pRoot);
}
private boolean isSame(TreeNode node1, TreeNode node2) {
if (node1 == null && node2 == null) return true;
if (node1 == null || node2 == null) return false;
return node1.val == node2.val
&& isSame(node1.left, node2.right)
&& isSame(node1.right, node2.left);
}
}
时间复杂度:O(N)
空间复杂度:O(N),最坏情况下,二叉树退化为链表
4、解题心得
本题容易一开始以为考察某种遍历(前序、中序或后序),但其实不然,虽然也是遍历,关键在于左右两边要同步走,并且是镜像对称地往下走,当走到哪一步发现不相等了,直接返回 false。