• 101. Symmetric Tree


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

    For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

        1
       / 
      2   2
     /  / 
    3  4 4  3
    

    But the following [1,2,2,null,3,null,3] is not:

        1
       / 
      2   2
          
       3    3
    

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

    发现了,tree的题基本都靠recursive

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public boolean isSymmetric(TreeNode root) {
            if(root == null) return true;
           return rec(root.left,root.right);
        }
        public boolean rec(TreeNode p, TreeNode q){
            if(p == null && q == null) return true;//When both left and right are null, meaning end.
            if(p == null || q == null) return false;//Means missing left or right, false.
            return ((p.val == q.val) &&
                     rec(p.left, q.right)&&
                     rec(q.left, p.right));
        }
    }

     recursive太费空间,iteration也可以

    class Solution {
       public boolean isSymmetric(TreeNode root) {
        if(root==null)  return true;
        
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode left, right;
        if(root.left!=null){
            if(root.right==null) return false;
            stack.push(root.left);
            stack.push(root.right);
        }
        else if(root.right!=null){
            return false;
        }
            
        while(!stack.empty()){
            right = stack.pop();
            left = stack.pop();
            if(right.val!=left.val) return false;
            
            if(left.left!=null){
                if(right.right==null)   return false;
                stack.push(left.left);
                stack.push(right.right);
            }
            else if(right.right!=null){
                return false;
            }
                
            if(left.right!=null){
                if(right.left==null)   return false;
                stack.push(left.right);
                stack.push(right.left);
            }
            else if(right.left!=null){
                return false;
            }
        }
        
        return true;
    }
    }
    public class Solution {
        public boolean isSymmetric (TreeNode root) {
            if (root == null) return true;
    
            Stack<TreeNode> s = new Stack<>();
            s.push(root.left);
            s.push(root.right);
    
            while (!s.isEmpty()) {
                TreeNode p = s.pop ();
                TreeNode q = s.pop ();
    
                if (p == null && q == null) continue;
                if (p == null || q == null) return false;
                if (p.val != q.val) return false;
    
                s.push(p.left);
                s.push(q.right);
    
                s.push(p.right);
                s.push(q.left);
            }
    
            return true;
        }
    }
  • 相关阅读:
    Iphone [Tab Bar实现多view切换,Picker,DataPicter实现
    基于socket、多线程的客户端服务器端聊天程序
    C/C++面试题
    Unity3D打Box游戏
    Unity3D项目开发一点经验
    Unity3D使用过程中常见的20个问题
    @property中strong跟weak的区别
    java多线程系列8 高级同步工具(2)CountDownLatch
    java多线程系列7 高级同步工具(1)信号量Semaphore
    java多线程系列6 synchronized 加强版 ReentrantLock
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/10489500.html
Copyright © 2020-2023  润新知