LeetCode刷题Easy篇判断一个二叉树是否对称

题目

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

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

 

But the following [1,2,2,null,3,null,3] is not:

    1
   / \
  2   2
   \   \
   3    3

 

Note:
Bonus points if you could solve it both recursively and iteratively.

 

我的尝试

递归解法,一遍成功,牛逼去了!!!其实递归的逻辑和判断两个二叉树是否相同一样,所以很容易就写出来了。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        TreeNode p=root;
        TreeNode q=root;
        return isMirror(p,q);
        
    }
    
     Boolean isMirror(TreeNode p,TreeNode q){
         if(p==null&&q==null) return true;
         if(p==null||q==null) return false;
         if(p.val!=q.val) return false;
         return isMirror(p.left,q.right)&&isMirror(p.right,q.left);
     }
}

非递归解法

为了防止面试的时候让写非递归,看了一些思路,原来没有处理二叉树的思路,看了答案后,豁然开朗。原理二叉树非递归的时候,循环的解决办法类似于先序遍历:

1.把根节点入队列或者栈

2. 循环容器不为空

3. 取出元素处理,然后把左右孩子节点入容器

基本都是这个套路。下面我们来看看利用这个思路解决二叉树是否对称,非递归就是用迭代的方法来求解。我看了leetcode上的代码,思路是对的,但是感觉重复元素进入队列,因为它搞了两个root,我感觉没有必要,所以自己写了一套,完美通过,分享给大家:

主要思路:

1. 搭建遍历二叉树的思路结构

2, 利用队列,把需要“对称比较”的元素,按顺序入队列

3  循环队列不为空,两两出队列进行比较,如果相同,继续,注意是继续,不同返回false

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null) return true;
        Queue queue=new LinkedList();
        queue.add(root.left);
        queue.add(root.right);
        while(!queue.isEmpty()){
            TreeNode node1=queue.poll();
            TreeNode node2=queue.poll();
            //开始写成了return,直接返回,应该继续
            if(node1==null&&node2==null) continue;
            if(node1==null||node2==null) return false;
            if(node1.val!=node2.val) return false;
            queue.add(node1.left);
            queue.add(node2.right);
            queue.add(node1.right);
            queue.add(node2.left);  
        }
        return true;
        
    }
   
}

LeetCode刷题Easy篇判断一个二叉树是否对称_第1张图片

 

你可能感兴趣的:(架构设计,java常见知识,Leetcode算法)