问题描述
请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
代码实现
/*
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)
{
if(pRoot == null){
return true;
}
return isSymmetrical(pRoot.left, pRoot.right);
}
//判断以node1为根节点的树t1和以node2为根节点的树t2是否相等
private boolean isSymmetrical(TreeNode node1, TreeNode node2){
if(node1 == null && node2 == null){
return true;
}
if(node1 == null || node2 == null){
return false;
}
if(node1.val == node2.val){
return isSymmetrical(node1.left, node2.right) && isSymmetrical(node1.right, node2.left);
}else{
return false;
}
}
}
注意的问题
- 注意这种在主调用函数里调用另一个递归函数的方法。而不是将主调用函数直接作为递归函数进行递归调用。
- isSymmetrical(TreeNode node1, TreeNode node2)函数:判断以node1为根节点的树和以node2为根节点的树是否对称:如果node1和node2都为空,返回true,如果node1和node2一个为空,一个不为空,返回false。如果node1的值不等于node2的值,说明从根节点开始两棵树就不相同,返回false。否则,返回isSymmetrical(node1.left, node2.right) && isSymmetrical(node1.right, node2.left),即当node1的值等于node2的值时,判断node1的左子树和node2的右子树是否对称以及node1的右子树和node2的左子树是否对称。