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

    参考 http://www.cnblogs.com/feiling/p/3251061.html & http://fisherlei.blogspot.com/2013/01/leetcode-symmetric-tree.html

    非递归解法:按层遍历,每一层检查一下是否对称。

    /**
     * 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;
            }
            
            LinkedList<TreeNode> l = new LinkedList<TreeNode>(),
            LinkedList<TreeNode> r = new LinkedList<TreeNode>();
             
             l.add(root.left);
             r.add(root.right);
             
             while(!l.isEmpty() && !r.isEmpty()) {
                 TreeNode t1 = l.poll(); TreeNode t2 = r.poll();
                 
                 if((t1 == null && t2 != null)||(t2 == null && t1 != null)){
                     return false;
                 }
                 
                 if( t1 != null){
                     if(t1.val != t2.val){
                         return false;
                     }
                     
                     l.add(t1.left);
                     l.add(t1.right);
                     r.add(t2.right);
                     r.add(t2.left);
                 }
                 
             }
             
             return true;
        }
    }

    递归解法:

     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         return checkSymmetric(root.left, root.right);
    16     }
    17     
    18     private boolean checkSymmetric(TreeNode left, TreeNode right){
    19         if(left == null && right == null)
    20             return true;
    21         
    22         if((left == null && right != null) || (left != null && right == null))
    23             return false;
    24         
    25         if(left.val != right.val)
    26             return false;
    27         
    28         return checkSymmetric(left.left, right.right) && checkSymmetric(left.right, right.left);
    29     }
    30 }
    其中左子树和右子树对称的条件:
      1. 两个节点值相等,或者都为空
      2. 左节点的左子树和右节点的右子树对称
      3. 左节点的右子树和右节点的左子树对称
        /**
         * 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;
                else
                    return check(root.left, root.right);
            }
            
            private boolean check(TreeNode left, TreeNode right){
                if(left == null) return right == null;
                if(right == null) return left == null;
                
                if(left.val != right.val)
                    return false;
                else
                    return check(left.left, right.right) && check(left.right, right.left);
            }
        }
  • 相关阅读:
    GUI 之 JDialog弹窗
    GUI Swing 之 JFrame窗体
    GUI 键盘监听事件
    GUI 窗口监听事件
    GUI 鼠标监听事件,模拟画图工具
    shell编程
    Ubuntu20.04 Linux初识
    rlwrap的使用
    5个相见恨晚的Linux命令,每一个都非常实用
    Bash初识与常用命令
  • 原文地址:https://www.cnblogs.com/RazerLu/p/3532674.html
Copyright © 2011-2022 走看看