二叉树是否是镜像对称

一、判断二叉树是否对称

给定一棵二叉树,判断它是否是自身的镜像(即:是否对称)
例如:下面这棵二叉树是对称的
      1
    /   \
  2       2
 / \      / \
3   4    4   3
下面这棵二叉树不对称。
     1
    / \
  2    2
    \    \
     3    3
备注:
希望你可以用递归和迭代两种方法解决这个问题
二、示例

  输入:{1,2,2}                 输出:true

  输入:{1,2,3,3,#,2,#}    输出:false

三、算法:

思路:用高度大于2的二叉树举例来说吧,也就是上面第一个例子,只要结点1的左孩子和结点2的右孩子相等,并且结点1的右孩子和结点2的左孩子相等,我们就认为是镜像,前提是结点1和结点2兄弟结点;

递归实现如下:

 1 public static boolean isSymmetric(TreeNode root) {
 2         if(root == null) 
         return true; 3 return in(root.left, root.right); 4 } 5 6 7 //递归 8 public static boolean in(TreeNode l1, TreeNode l2){ 9 if(l1 == null && l2 == null)
          return true; 10 if(l1 == null || l2 == null)
          return false; 11 return l1.val == l2.val && in(l1.left,l2.right) && in(l1.right,l2.left); 12 }
}

 

非递归调用

//迭代
    public static boolean isSymm(TreeNode root){
        if(root == null) 
             return true;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root.left);
        q.add(root.right);
        while (!q.isEmpty()) {
            TreeNode t1 = q.poll();
            TreeNode t2 = q.poll();
            if (t1 == null && t2 == null) continue;
            if (t1 == null || t2 == null) return false;
            if (t1.val != t2.val) return false;
            
       q.offer(t1.left); q.offer(t2.right); q.offer(t1.right); q.offer(t2.left); }
return true; }

 

 

 

 
posted @ 2020-11-16 12:47  linghu_java  阅读(493)  评论(0编辑  收藏  举报