对称二叉树
递归
既然要检验是否对称,那么就是检验两个对称节点是否相同。也就是说,要实现检验一对对称结点的值是否相等的函数。然后再用递归的思想将左右儿子结点也一起检验了。
代码实现
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
return judge(root.left,root.right);
}
public boolean judge(TreeNode l,TreeNode r){
if((l==null && r==null)){ return true;}
if(l==null || r==null){ return false;}
return l.val==r.val && judge(l.left,r.right) && judge(l.right,r.left);
}
}
在完成这个代码的时候出现了两个误区
- 第一次写的时候没有考虑全面,忽略了root为null的情况,我对边缘情况的处理一直很粗糙
- 对于l和r的多种情况处理时没有考虑完整。如果l和r都为null时,则不需要考虑儿子结点直接return就好了。第二个if语句是在第一个if语句不成立的情况下执行的,因此可以直接写一个or就完成情况处理。
迭代
可以用一个队列来将递归改成迭代。在while语句中,将左结点的左儿子和右节点的右儿子放入队列,然后将左节点的右儿子和右节点的左儿子放入队列,下一次循环时取出队列的前两个元素。
代码实现
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
return judge(root,root);
}
public boolean judge(TreeNode l,TreeNode r){
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.offer(l);
q.offer(r);
while(!q.isEmpty()){
l=q.poll();
r=q.poll();
if(l==null && r==null){ continue;}
if(l==null || r==null || l.val!=r.val) {return false;}
q.offer(l.left);
q.offer(r.right);
q.offer(l.right);
q.offer(r.left);
}
return true;
}
}
现在对于队列的使用还不是特别熟悉,等做多了应该就会掌握了吧