• 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 

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

    confused what "{1,#,2,3}" means? 

     

    OJ's Binary Tree Serialization:

    The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.

    Here's an example:

       1
      / 
     2   3
        /
       4
        
         5
    

    The above binary tree is serialized as "{1,2,3,#,#,4,#,#,5}".


    解题思路:

    1. 递归

    2. iterative,建立两个queue, 一个从左往右,一个从右往左,镜像比较

    仔细考虑每种情况,很容易漏掉。


    Java code :

    recursion:

    public class Solution {
        public boolean isSymmetric(TreeNode root) {
            if(root == null) {
               return true;
            }
            return isSymmetric(root.left, root.right);
        }
        
        public boolean isSymmetric(TreeNode l, TreeNode r) {
            if(l == null && r == null){
                return true;
            }else if(l == null || r == null) {
                return false;
            }
            if(l.val != r.val ){
                return false;
            }
            if(!isSymmetric(l.left,r.right)) {
                return false;
            }
            if(!isSymmetric(l.right,r.left)) {
                return false;
            }
            return true;
        }
    }

    iterative

    public class Solution {
        public boolean isSymmetric(TreeNode root) {
            //use iterative
            if(root == null){
                return true;
            }
            Queue<TreeNode> left = new LinkedList<TreeNode>();
            Queue<TreeNode> right = new LinkedList<TreeNode>();
            left.add(root.left);
            right.add(root.right);
            while(!left.isEmpty() && !right.isEmpty()) {
                TreeNode l = left.remove();
                TreeNode r = right.remove();
                if(l== null && r== null) {
                    continue;
                }else if(l == null || r == null){
                    return false;
                }
                
                if(l.val != r.val) {
                    return false;
                }else {
                    left.add(l.left);
                    left.add(l.right);
                    right.add(r.right);
                    right.add(r.left);
                }
            }
            return true;
        }
    }

    Reference:

    1. http://www.programcreek.com/2014/03/leetcode-symmetric-tree-java/

  • 相关阅读:
    urllib.request.urlretrieve()
    python2.X与python3.X爬虫常用的模块变化对应
    .net 发布程序时出现“类型ASP.global_asax同时存在于...”错误的解决办法
    批量引用iconfont字体图标到项目
    动态设置bootstrapswitch状态
    MD5加密过时方法替换
    SQL语句
    PHP中的闭包
    算法复杂度
    快速排序
  • 原文地址:https://www.cnblogs.com/anne-vista/p/4812014.html
Copyright © 2020-2023  润新知