给定一个二叉树,检查它是否是镜像对称的。
递归法:1.确认返回值与输入参数:
boolean sup(TreeNode left,TreeNode right)
很容易可以确认输入参数是左右子树,返回值是boolean型
2.确认终止条件:
if(left==null&&right==null) return true;
if(left==null||right==null) return false;
即若是有一个子树不存在,则返回false
3.确认递归内容
if(left.val!=right.val) return false;
return sup(left.left,right.right)&&sup(left.right,right.left);
即判断左右子树是否值相等。
注意:对称二叉树是判别左子树的左子树与右子树的右子树是否对称,是镜像的!
迭代法:可以用双端队列,亦可以用不同队列
使用双端队列解本题,会容易一些,思路与迭代法类似,不断往队列头部添加左子树的相关子树,往尾部添加右子树的相关子树。但注意要把握好添加的顺序,这个自己模拟一下即可
public boolean isSymmetric(TreeNode root) {
Deque
if(root==null) return true;
deque.offerFirst(root.left);
deque.offerLast(root.right);
while(!deque.isEmpty()){
TreeNode left = deque.pollFirst();
TreeNode right = deque.pollLast();
if(left==null&&right==null) continue;
if(left==null||right==null) return false;
if(left.val!=right.val) return false;
deque.offerFirst(left.left);
deque.offerFirst(left.right);
deque.offerLast(right.right);
deque.offerLast(right.left);
}
return true;
}
单队列:方法与双端队列类似,区别在于队列放入顺序上边稍微复杂了一些。
public boolean isSymmetric(TreeNode root) {
Queue
if(root==null) return true;
queue.offer(root.left);
queue.offer(root.right);
while(!queue.isEmpty()){
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if(left==null&&right==null) continue;
if(left==null||right==null) return false;
if(left.val!=right.val) return false;
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
return true;
}
