美文网首页
leetcode--tree

leetcode--tree

作者: NOTEBOOK2 | 来源:发表于2018-04-05 00:11 被阅读0次
    1. Binary Tree Inorder Traversal
    class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
            List<Integer> list = new ArrayList<Integer>();
            helper(root, list);
            return list;
        }
        
        public void helper(TreeNode root, List<Integer> list) {
            if(root == null) {
                return;
            }
            helper(root.left, list);
            list.add(root.val);
            helper(root.right, list);
        }
    }
    
    1. Binary Tree Preorder Traversal
    
    class Solution {
        // root left right
        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> result = new ArrayList<Integer>();
            
            preorderTraversalHelper(root, result);
            
            return result;
        }
        
        private List<Integer> preorderTraversalHelper(TreeNode node, List<Integer> list) {
            if (node == null) {
                return list;
            }
            
            list.add(node.val);
            
            preorderTraversalHelper(node.left, list);
            preorderTraversalHelper(node.right, list);
            
            return list;
        }
    }
    
    1. Kth Smallest Element in a BST
    class Solution {
        int value = Integer.MAX_VALUE;
        int idx = 0;
        public int kthSmallest(TreeNode root, int k) {
            if (root == null)   return -1;
            findKthSmallest(root, k);
            if (idx == k)
                return value;
            
            return -1;
        }
        
        int findKthSmallest(TreeNode root, int k) {
            if (root.left != null) {
                int left = findKthSmallest(root.left, k);
                if (left == k)  return left;
            }
            
            idx++;
            if (idx == k) {
                value = root.val;
                return idx;
            }
            
            if (root.right != null)
                return findKthSmallest(root.right, k);
            else    return idx;
        }
    }   
    
    1. Binary Search Tree Iterator
    public class BSTIterator {
        private TreeNode root;
        public BSTIterator(TreeNode root) {
            this.root = root;
        }
    
        /** @return whether we have a next smallest number */
        public boolean hasNext() {
            return root != null;
        }
    
        /** @return the next smallest number */
        public int next() {
            if (root == null) {
                return -1;
            }
            
            int ans = 0;
            while (root != null) {
                if (root.left == null) {
                    ans = root.val;
                    root = root.right;
                    break;
                } else {
                    TreeNode tmp = root.left;
                    while (tmp.right != null && tmp.right != root) {
                        tmp = tmp.right;
                    }
                    
                    if (tmp.right == null) {
                        tmp.right = root;
                        root = root.left;
                    } else {
                        ans = root.val;
                        tmp.right = null;
                        root = root.right;
                        break;
                    }
                }
            }
            
            return ans;
        }
    }  
    
    1. Binary Tree Level Order Traversal
    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
           /** List<List<Integer>> res = new ArrayList<>();
            if(root == null)
                return res;
            Queue<TreeNode> q = new LinkedList<>();
            q.offer(root);
            q.offer(null);
            while(!q.isEmpty() && q.peek()!= null){
                List<Integer> temp = new ArrayList<>();
                TreeNode p = q.poll();
                while(p != null){
                    temp.add(p.val);
                    if(p.left != null)
                        q.offer(p.left);
                    if(p.right != null)
                        q.offer(p.right);
                    p = q.poll();
                }
                res.add(temp);
                q.offer(null);
            }
            return res;*/
            List<List<Integer>> res = new ArrayList<>();
            if(root == null)
                return res;
            helper(res,root,0);
            return res;
        }
        
        private void helper(List<List<Integer>> res, TreeNode root, int level){
            if(root == null)
                return;
            if(level >= res.size())res.add(new ArrayList<Integer>());
            res.get(level).add(root.val);
            helper(res,root.left,level+1);
            helper(res,root.right,level+1);
        }
    }
    
    1. Binary Tree Right Side View
    class Solution {
        public List<Integer> rightSideView(TreeNode root) {
            List<Integer> result = new ArrayList<>();
            getRightView(root, 0, result);
            return result;
        }
        
        public void getRightView(TreeNode root, int currentDepth, List<Integer> result){
            if(root==null)
                return;
            if(currentDepth == result.size()){
                result.add(root.val);
            }
            getRightView(root.right, currentDepth + 1, result);
            getRightView(root.left, currentDepth + 1, result);
        }
    }  
    
    1. Unique Binary Search Trees
    class Solution {
        public int numTrees(int n) {
            if(n <= 0) return 0;
            
            int[] res = new int[n + 1];
            res[0] = 1;
            res[1] = 1;
            for(int i = 2; i <= n; i++){
                for(int j = 0; j < i; j++){
                    res[i] += res[j] * res[i - j - 1];
                }
            }
            
            return res[n];
        }
    }   
    
    1. Populating Next Right Pointers in Each Node
    public class Solution {
        public void connect(TreeLinkNode root) {
            if (root == null) return ;
            
            if (root.left != null) {
                root.left.next = root.right;
            }
            if (root.right != null) {
                if (root.next != null) {
                    root.right.next = root.next.left;
                }
                else { // root.next == null
                    root.right.next = null;
                }
            }
            connect(root.left);
            connect(root.right);
        }
    }
    
    1. Binary Tree Zigzag Level Order Traversal
    class Solution {
        public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
            List<List<Integer>> res = new ArrayList<>();
            helper(res,root,1);
            return res;
        }
        public void helper(List<List<Integer>> res, TreeNode node,int lvl){
            if(node==null) return;
            if(lvl>res.size()){
                List<Integer> newlist = new ArrayList<>();
                newlist.add(node.val);
                res.add(newlist);
            }
            else{
                if(lvl%2==0) res.get(lvl-1).add(0,node.val);
                else res.get(lvl-1).add(node.val);
            }
            helper(res,node.left,lvl+1);
            helper(res,node.right,lvl+1);
        }
    }
    
    1. Flatten Binary Tree to Linked List
    class Solution {
        private TreeNode last = null;
        public void flatten(TreeNode root) {
            if (root == null) {
                return;
            }
            if (last != null) {
                last.left = null;
                last.right = root;
            }
            last = root;
            
            TreeNode right = root.right;
            flatten(root.left);
            flatten(right);
        }
    }
    
    public class Solution {
        public void flatten(TreeNode root) {
            if(root == null) return;
            if(root.left != null){
                flatten(root.left);
                TreeNode cur = root;
                TreeNode temp = root.right;
                root.right = root.left;
                root.left = null;
                while(cur.right != null) cur = cur.right;
                cur.right = temp;
                flatten(temp);
            }
            else{
                flatten(root.right);
            }
        }
    }
    
    1. Path Sum II
    class Solution {
        public List<List<Integer>> pathSum(TreeNode root, int sum) {
            List<List<Integer>> res = new ArrayList<List<Integer>>();
            if(root == null) return res;
            List<Integer> temp = new ArrayList<>();        
            helper(root, sum, temp, res);
            return res;
            
        }
        
        private void helper(TreeNode root, int sum, List<Integer> temp, List<List<Integer>> res) {
            if(root == null) return;
            else if (root.val == sum && root.left == null && root.right == null) {
                temp.add(root.val);
                res.add(new ArrayList<>(temp));
                temp.remove(temp.size() - 1);
                return;
            }else 
                temp.add(root.val);
            helper(root.left, sum - root.val, temp, res);
            helper(root.right, sum - root.val, temp, res);  
            temp.remove(temp.size() - 1);
        }
    }
    
    1. Construct Binary Tree from Preorder and Inorder Traversal
    class Solution {
        public TreeNode buildTree(int[] preorder, int[] inorder) {
            return buildTree(preorder,0,inorder,inorder.length-1,0);
            
        }
        private TreeNode buildTree(int[] preorder,int p,int[] inorder,int start,int end){
            if(start<end || p>preorder.length-1)
                return null;
            int val = preorder[p];
            int index = start;
            for(int i=start;i>=end;i--){
                if(val==inorder[i]){
                    index = i;
                    break;
                }
            }
            TreeNode node = new TreeNode(val);
            node.left = buildTree(preorder,p+1,inorder,index-1,end);
            node.right = buildTree(preorder,p+(index-end)+1,inorder,start,index+1);
            return node;
        }
    }
    
    1. Populating Next Right Pointers in Each Node II
    public class Solution {
        public void connect(TreeLinkNode root) {
            while (root != null) {
                TreeLinkNode current = root;
                TreeLinkNode dummy = new TreeLinkNode(0);
                TreeLinkNode p = dummy;
                
                while (current != null) {
                    if (current.left != null) {
                        p.next = current.left;
                        p = p.next;
                    }
                    if (current.right != null) {
                        p.next = current.right;
                        p = p.next;
                    }
                    current = current.next;
                }
                
                root = dummy.next;
            }
        }
    }
    
    1. Construct Binary Tree from Inorder and Postorder Traversal
    class Solution {
        int p_inorder;
        int p_postorder;
        public TreeNode buildTree(int[] inorder, int[] postorder) {
            p_inorder = inorder.length - 1;
            p_postorder = postorder.length-1;
            return helper(inorder, postorder, null);
        }
        public TreeNode helper(int[] inorder, int[] postorder, TreeNode end){
            if(p_postorder < 0){
                return null;
            }
            TreeNode root = new TreeNode(postorder[p_postorder--]);
            if(inorder[p_inorder] != root.val){
                root.right = helper(inorder,postorder,root);
            }
            p_inorder--;
            if((end == null) || (inorder[p_inorder] != end.val)){
                root.left = helper(inorder,postorder,end);
            }
            return root;
        }
    }
    
    1. Lowest Common Ancestor of a Binary Tree
    class Solution {
        
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            if (root == null) {
                return null;
            }
            if (root == p || root == q) {
                return root;
            }
            TreeNode left = lowestCommonAncestor(root.left, p, q);
            TreeNode right = lowestCommonAncestor(root.right, p, q);
            if (left == null) {
                return right;
            }
            if (right == null) {
                return left;
            }
            return root;
        } 
        
        // BFS, map<curr, parent>, common ancestor must be p or q or one of their parent
        public TreeNode lowestCommonAncestor1(TreeNode root, TreeNode p, TreeNode q) {
            if (root == null || p == null || q == null) {
                return null;
            }
            Map<TreeNode, TreeNode> map = new HashMap<>();
            Deque<TreeNode> queue = new ArrayDeque<TreeNode>();
            queue.offer(root);
            while (!queue.isEmpty()) {
                TreeNode tmp = queue.poll();
                if (tmp.left != null) {
                    map.put(tmp.left, tmp);
                    queue.offer(tmp.left);
                }
                if (tmp.right != null) {
                    map.put(tmp.right, tmp);
                    queue.offer(tmp.right);
                }
            }
            Set<TreeNode> set = new HashSet<>();
            while (p != null) {
                set.add(p);
                p = map.get(p);
            }
            while (!set.contains(q)) {
                q = map.get(q);
            }
            return q;
        }
    }  
    
    1. Count Complete Tree Nodes
    public class Solution {
        public int countNodes(TreeNode root) {
            
            if(root==null){
                return 0;
            }
            
            Queue<TreeNode> q = new LinkedList<TreeNode>();
            q.add(root);
            int count=1;
            while(!q.isEmpty()){
                TreeNode temp = q.poll();
                if(temp.val!=-100){
                    temp.val=-100;
                    
                    if(temp.left!=null){
                        q.offer(temp.left);
                        count++;
                    }
                    
                    if(temp.right!=null){
                        q.offer(temp.right);
                        count++;
                    }
                }
            }
            return count;
        }
    }
    
    1. Validate Binary Search Tree
    class Solution {
        public boolean isValidBST(TreeNode root) {
            return helper(root, Long.MIN_VALUE, Long.MAX_VALUE);
        }
        
        public boolean helper(TreeNode root, long min, long max){
            if(root == null)
                return true;
            
            if(root.val >= max || root.val <= min)
                return false;
            
            return helper(root.left, min, root.val) && helper(root.right, root.val, max);
        }
    }
    

    相关文章

      网友评论

          本文标题:leetcode--tree

          本文链接:https://www.haomeiwen.com/subject/ssxrhftx.html