问题描述:
给定一个二叉树,检查它是否是镜像对称的。
示例:
二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
分析:
把它直接看成只有三个节点(根节点,左子树,右子树)的树,不需要展开,直接调用。
这个题需要两个方法,一个方法是判断两棵树是否是相同的,另一个是用来调用这个方法的。对于判断两棵树是否是相同的这个方法,有三种情况来考虑。
1.如果p这棵树的根节点是null的并且q这棵树的根节点也是null,虽然他们是空树,但是他们依旧是相同的树。
2.如果p或者q只有一个是null,那么直接返回false;
3.如果根节点p的val和根节点q的val值相同,并且 p 的左子树和右子树都与 q 的左子树和右子树相同(这一块的相同直接调用去判断,不需要展开,因为只要展开了就复杂了)
对调用的这个方法来说,首先需要先判断他是否是空树,如果是空树直接返回true。接着调用isMirrorTree这个方法来判断这棵树的左子树和右子树是否是对称的,也就是镜面的树。
class Solution {
public boolean isMirrorTree(TreeNode p,TreeNode q){
if(p == null && q == null){
return true;
}
if(p == null || q == null){
return false;
}
return p.val == q.val && isMirrorTree(p.left,q.right) && isMirrorTree(p.right,q.left);
}
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
return isMirrorTree(root.left,root.right);
}
}