20.对称二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。
如果一棵二叉树和它的镜像一样,那么它是对称的。
样例
如下图所示二叉树[1,2,2,3,4,4,3,null,null,null,null,null,null,null,null]为对称二叉树:
1
/ \
2 2
/ \ / \
3 4 4 3
如下图所示二叉树[1,2,2,null,4,4,3,null,null,null,null,null,null]不是对称二叉树:
1
/ \
2 2
\ / \
4 4 3
思路
由于刚做了二叉树镜像那道题,然后本题目中提醒用镜像来做,我一开始就傻乎乎的把所给的二叉树镜像弄出来,然后又傻乎乎地返回了这个镜像的root,还美其名曰mRoot。
然而这样做是错误的,事实上弄出来的镜像和你比较的二叉树是一棵树!!!啊,好脑残。。。我说怎么一直返回true。。
事实上这道题并不难,就是找规律。如果一棵树是对称二叉树,那么它的左子树和右子树肯定互为镜像。现在要思考的是如何判断左子树和右子树是否成镜像这件事。
如果左子树和右子树互为镜像,那么左子树的左子树跟右子树的右子树肯定一样,同理,左子树的右子树肯定跟右子树的左子树一样。与《镜像二叉树》不同的是,那道题让构造,这道题让判断。注意区别。
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null)
{
return true;
}
return isSymmetric(root.left,root.right);
}
public boolean isSymmetric(TreeNode p1,TreeNode p2)
{
//注意此处的判断语句,可以当做判断两树是否在某些条件下相等的模板来用
//具体逻辑是:两个同时都空?就当你相等。
// 既然不是两个都空?那么肯定至少有一个不空,如果仅有一个不空,肯定不相等。
// 现在两个都不空了,开始值的判断。
if(p1==null &&p2==null)
{
return true;
}
if(p1==null || p2==null)
{
return false;
}
if(p1.val!=p2.val)
{
return false;
}
return isSymmetric(p1.left,p2.right)&&isSymmetric(p1.right,p2.left);
}
}