zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    机器学习中 margin loss 、hinge loss 和 ramp loss 的区别
    ML 论文中 用到的 temperature
    对一系列 pickle load 进行解包,只保留最后几个
    Linux 常用命令速览
    Numpy 的 dtype 和 astype 的区别
    远程配置 tensorflow 环境
    pytorch 的一些坑
    Conda 配置虚拟 pytorch 环境 和 Tensorflow 环境
    Ubuntu 远程离线配置 pytorch 运行环境
    3.Vue起步
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4084374.html
Copyright © 2011-2022 走看看