方法一:递归法
1、递归函数的参数和返回值:
参数:两个比较的节点
返回值:布尔类型,是否是对称的
2、递归终止条件:
a、如果两个比较节点为空,则返回true
b、如果两个节点又一个为空,则返回false,
c、如果两个节点的数值不相同,则返回false,
d、剩下就是两个节点数值相同,数值相同就需要继续向下判断
3、单层递归的逻辑:
如果两个数值相同,则要分别进行比较内侧和外侧是否对称,返回内侧和外侧的与值
// 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
// 比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
// 如果左右都对称就返回true ,有一侧不对称就返回false 。
代码如下:
public boolean isSymmetric(TreeNode root) {
if (root == null)
return true;
else if (root.left != null && root.right == null){
return false;
} else if (root.left == null && root.right!= null) {
return false;
}
return compare(root.left,root.right);
}
public static boolean compare(TreeNode left, TreeNode right){
if (left == null && right != null){
return false;
} else if (left != null && right == null){
return false;
} else if (left==null&&right==null){
return true;
} else if (left.val != right.val) {
return false;
}
boolean inner = compare(left.right,right.left);
boolean outter = compare(left.left,right.right);
boolean finall = inner && outter;
return finall;
}
方法二:迭代法
public boolean isSymmetric1(TreeNode root){
if (root == null)
return true;
else if (root.left != null && root.right == null){
return false;
} else if (root.left == null && root.right!= null) {
return false;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root.left);
queue.add(root.right);
while (!queue.isEmpty()){
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if (left == null && right == null){
continue; //注意这个地方不可以用return true,否则直接跳出方法了,这个地方要使用continue 跳出这个if语句
} else if (left != null && right == null){
return false;
} else if (left == null && right != null){
return false;
} else if (left.val != right.val) {
return false;
}
queue.add(left.left);
queue.add(right.right);
queue.add(left.right);
queue.add(right.left);
}
return true;
}