领扣(LeetCode)对称二叉树 个人题解

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

 

(算法萌新,轻拍求指点 XD 此题思路参考了官方题解。)

由于是很久没有接触这种类型的题目了,所以第一次拿到有点懵。还是看了题解才找回感觉。
看这个二叉树是不是对称的,主要是看二叉树左边和右边的节点是不是各自相反。每一层都是左右颠倒。
所以通过递归,判断左树和右树相反的节点的值是不是相同。
如果两边都为空,正常退出,说明递归到树的底部了。
如果有一边空了另外一半没空,说明有一边的节点没了,另外一半还在,肯定不是对称的树
如果两边对称,继续递归节点的左右节点,直到递归完全或者发现不对称。
代码如下:
递归:

 1 class Solution {
 2     public boolean isSymmetric(TreeNode root) {
 3         return isMirror(root, root);
 4     }
 5 
 6     boolean isMirror(TreeNode t1, TreeNode t2) 
 7     {
 8         if (t1 == null && t2 == null)
 9             return true;
10         if(t1 == null ||t2==null)
11             return false;
12         if(t1.val==t2.val)
13         {
14             return true && isMirror(t1.right, t2.left) && isMirror(t1.left, t2.right);
15         }
16         return false;
17     }
18 
19 }

 

第二种方法是迭代,虽然知道做法和用意,但是在使用上不够熟练。大概思路就是把待处理的节点入队,然后依次出队处理,获取新的待处理节点入队。
在处理时出现了一个问题,在迭代时遇到两个都为空的节点不能直接退出循环,虽然可能是二叉树的底部,但是因为这时队列里可能还有其他未处理的节点等待处理,不能直接返回。
代码如下:
迭代:

 1 class Solution {
 2     
 3     
 4     public boolean isSymmetric(TreeNode root)
 5     {
 6         Queue<TreeNode> queue=new LinkedList<TreeNode>();
 7         queue.add(root);
 8         queue.add(root);
 9         while(!queue.isEmpty())
10         {
11             TreeNode t1=queue.poll();
12             TreeNode t2=queue.poll();
13             if(t1==null && t2==null)
14                 continue;
15             if(t1==null || t2==null)
16             {
17                 return false;
18             }
19             if(t1.val!=t2.val)
20                 return false;
21             queue.add(t1.left);
22             queue.add(t2.right);
23             queue.add(t1.right);
24             queue.add(t2.left);
25             
26         }
27         return true;
28     }
29 }

 

posted @ 2018-10-30 20:27  AXiangCoding  阅读(237)  评论(0编辑  收藏  举报