• Leetcode-Symmetric Tree


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

    For example, this binary tree is symmetric:

        1
       / 
      2   2
     /  / 
    3  4 4  3
    

    But the following is not:

        1
       / 
      2   2
          
       3    3
    
    Iterative solution:
    /**
     * Definition for binary tree
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public boolean isSymmetric(TreeNode root) {
            if (root==null) return true;
    
            List<TreeNode> left = new LinkedList<TreeNode>();
            List<TreeNode> right = new LinkedList<TreeNode>();
            List<Integer> state = new LinkedList<Integer>();
            left.add(root.left);
            right.add(root.right);
            state.add(0);
            int level = 0;
            while (level>=0){
                int curState = state.get(level);
                TreeNode node1 = left.get(level);
                TreeNode node2 = right.get(level);
    
                //Newly enqueue
                if (curState == 0){
                    if (node1==null && node2==null){
                        state.remove(level);
                        left.remove(level);
                        right.remove(level);
                        level--;
                        continue;
                    }
                    if (node1==null && node2!=null) return false;
                    if (node1!=null && node2==null) return false;
                    if (node1.val!=node2.val) return false;
                    //Check node1.left && node2.right. change state.
                    state.set(level,1);
                    left.add(node1.left);
                    right.add(node2.right);
                    state.add(0);
                    level++;
                    continue;
                }
                //Check node1.right && node2.leflt, change state.
                if (curState==1){
                    state.set(level,2);
                    left.add(node1.right);
                    right.add(node2.left);
                    state.add(0);
                    level++;
                    continue;
                }
    
                //Already checked left and right subtree, backtrack.
                state.remove(level);
                left.remove(level);
                right.remove(level);
                level--;
            }
            return true;
        }
    }

    Solution:
     1 /**
     2  * Definition for binary tree
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public boolean isSymmetric(TreeNode root) {
    12         if (root==null)
    13             return true;
    14         
    15         boolean res = isSymmetricRecur(root.left,root.right);
    16         
    17         return res;
    18     }
    19     
    20     //Determine whether the tree "left" and the tree "right" is symmetric.
    21     public boolean isSymmetricRecur(TreeNode left, TreeNode right){
    22         //One is null, the other is not, then false;
    23         if ((left==null && right!=null)||(left!=null&&right==null))
    24             return false;
    25             
    26         //Both are empty, then true;
    27         if (left==null&&right==null)
    28             return true;
    29         
    30         //Both are not empty, but val is not the same, then false.
    31         if (left.val!=right.val)
    32             return false;
    33         
    34         //Both of them are leaf nodes
    35         if (left.left==null&&left.right==null&&right.left==null&&right.right==null)
    36             if (left.val==right.val)
    37                 return true;
    38             else 
    39                 return false;
    40         
    41         boolean leftSym = isSymmetricRecur(left.left,right.right);
    42         if (!leftSym)
    43             return false;
    44             
    45         boolean rightSym = isSymmetricRecur(left.right,right.left);
    46         if (!rightSym)
    47             return false;
    48             
    49             
    50         return true;
    51     }
    52 }

    This is an recursion solution. For easy solution, we can use BFS to put every node into a list orderred by level, then check whether the nodes on the same level are symmetric.

    NOTE: we need consider all situation carefully. I failed several times because of missing some situations!

  • 相关阅读:
    git让线上代码强制覆盖本地的
    redis连接时报错:Could not connect to Redis at 127.0.0.1:6379: Connection refused
    Apache使用内置插件mod_php解析php的配置
    Apache2.4+PHP7.2配置站点访问变下载
    Linux下查看某一进程所占用内存的方法
    SNMP监控一些常用OID的总结
    kafka 生产消费原理详解
    HttpServletRequest接收参数的几种方法
    【转载】idea 2018注册码(激活码)永久性的
    SecureCRT & SecureFx 绿色破解版
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4084374.html
Copyright © 2020-2023  润新知