zoukankan      html  css  js  c++  java
  • LeetCode: Symmetric Tree 解题报告

    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? > read more on how binary tree is serialized on OJ.

    SOL 1 & 2:

    两个解法,递归和非递归.

     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     // solution 1:
    12     public boolean isSymmetric(TreeNode root) {
    13         if (root == null) {
    14             return true;
    15         }
    16         
    17         return isSymmetricTree(root.left, root.right);
    18     }
    19     
    20     /*
    21      * 判断两个树是否互相镜像 
    22         (1) 根必须同时为空,或是同时不为空
    23      * 
    24      * 如果根不为空: 
    25         (1).根的值一样 
    26         (2).r1的左树是r2的右树的镜像 
    27         (3).r1的右树是r2的左树的镜像
    28      */
    29     public boolean isSymmetricTree1(TreeNode root1, TreeNode root2) {
    30         if (root1 == null && root2 == null) {
    31             return true;
    32         }
    33         
    34         if (root1 == null || root2 == null) {
    35             return false;
    36         }
    37         
    38         return root1.val == root2.val && 
    39              isSymmetricTree(root1.left, root2.right) && 
    40              isSymmetricTree(root1.right, root2.left);
    41     }
    42     
    43     // solution 2:
    44     public boolean isSymmetricTree(TreeNode root1, TreeNode root2) {
    45         if (root1 == null && root2 == null) {
    46             return true;
    47         }
    48         
    49         if (root1 == null || root2 == null) {
    50             return false;
    51         }
    52         
    53         Stack<TreeNode> s1 = new Stack<TreeNode>();
    54         Stack<TreeNode> s2 = new Stack<TreeNode>();
    55         
    56         // 一定记得初始化
    57         s1.push(root1);
    58         s2.push(root2);
    59         
    60         while (!s1.isEmpty() && !s2.isEmpty()) {
    61             TreeNode cur1 = s1.pop();
    62             TreeNode cur2 = s2.pop();
    63             
    64             if (cur1.val != cur2.val) {
    65                 return false;
    66             }
    67             
    68             if (cur1.left != null && cur2.right != null) {
    69                 s1.push(cur1.left);
    70                 s2.push(cur2.right);
    71             } else if (!(cur1.left == null && cur2.right == null)) {
    72                 return false;
    73             }
    74             
    75             if (cur1.right != null && cur2.left != null) {
    76                 s1.push(cur1.right);
    77                 s2.push(cur2.left);
    78             } else if (!(cur1.right == null && cur2.left == null)) {
    79                 return false;
    80             }
    81         }
    82         
    83         return true;
    84     }
    85 }
    View Code

    2015.1.20:

    简化了递归的解法,root与root本身是一对对称树。

     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         return isMirror(root, root);
    13     }
    14     
    15     public boolean isMirror(TreeNode r1, TreeNode r2) {
    16         if (r1 == null && r2 == null) {
    17             return true;
    18         } else if (r1 == null || r2 == null) {
    19             return false;
    20         }
    21         
    22         return r1.val == r2.val
    23              && isMirror(r1.left, r2.right)
    24              && isMirror(r1.right, r2.left);
    25     }
    26 }
    View Code

    GITHUB:

    https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/tree/IsSymmetric.java

  • 相关阅读:
    理解javascript 对象,原型对象、闭包
    JSON数据理解
    css 盒模型相关样式
    神奇的CSS3选择器
    设计模式六大原则
    java反射机制性能优化
    一份关于jvm内存调优及原理的学习笔记
    浅谈http请求数据分析
    Apache+Tomcat部署负载均衡(或集群)
    同台电脑部署多组Tomcat负载均衡(或集群)
  • 原文地址:https://www.cnblogs.com/yuzhangcmu/p/4141477.html
Copyright © 2011-2022 走看看