题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
解题思路
最初的想法是考虑一个节点的两个子节点的值是否相等,但是如果树的深度>2,就会得到错误结果了。
看书上的思路是这样的:考虑先序遍历,先遍历根节点,再左孩子,最后右孩子。如果是一个对称的二叉树,先遍历右孩子,再遍历左孩子得到的结果应该是一致的。利用递归的思想就可以解决这个问题了。
需要注意的是判断false的条件:
1.只有一个为null(因为上一个判断条件是两个都为null才成立,所以这条判断语句中只要有一个为null则另一个一定非空)
2.判断当前两个根节点的值是否相等
代码实现
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
TreeNode p1 = pRoot;
TreeNode p2 = pRoot;
return isSymmetrical(p1, p2);
}
boolean isSymmetrical(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 isSymmetrical(p1.left, p2.right) && isSymmetrical(p1.right, p2.left);
}
}