ogv

Untitled

ogv
Sep 22nd, 2019
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.86 KB | None | 0 0
  1. /**
  2.  * Definition for a binary tree node.
  3.  * public class TreeNode {
  4.  *     int val;
  5.  *     TreeNode left;
  6.  *     TreeNode right;
  7.  *     TreeNode(int x) { val = x; }
  8.  * }
  9.  */
  10. class Solution {  
  11.     public int minCameraCover(TreeNode root) {
  12.         Solver solver = new Solver(root);
  13.         solver.solve();
  14.         return solver.getCameras();
  15.     }    
  16. }
  17.  
  18. class Solver {
  19.     int cameras;
  20.     TreeNode root, top, mid, bottom;
  21.     HashSet<TreeNode> visited = new HashSet<>();
  22.     HashSet<TreeNode> covered = new HashSet<>();
  23.  
  24.     Solver(TreeNode root) {
  25.         this.root = root;
  26.     }
  27.  
  28.     public void solve() {
  29.         for(;;) {
  30.             descend();
  31.  
  32.             if (!isCovered(bottom)) {
  33.                 setCamera(mid, top);                    
  34.             }
  35.  
  36.             if (mid == null) break;
  37.  
  38.             visited.add(bottom);
  39.         }            
  40.     }
  41.    
  42.     public int getCameras() {
  43.         return cameras;
  44.     }
  45.  
  46.     private void descend() {
  47.         top = mid = bottom = null;            
  48.         TreeNode current = root;
  49.  
  50.         while (current != null) {
  51.             top = mid;
  52.             mid = bottom;
  53.             bottom = current;
  54.             current = (current.left != null && !visited.contains(current.left))
  55.                 ? current.left
  56.                 : !visited.contains(current.right) ? current.right : null;
  57.         }
  58.     }
  59.  
  60.     private void setCamera(TreeNode mid, TreeNode top) {
  61.         cameras++;
  62.         setCovered(top);
  63.         setCovered(mid);
  64.         if (mid != null) {
  65.             setCovered(mid.left);
  66.             setCovered(mid.right);
  67.         }
  68.     }
  69.  
  70.     private void setCovered(TreeNode node) {
  71.         if (node != null && !isCovered(node)) covered.add(node);
  72.     }
  73.  
  74.     private boolean isCovered(TreeNode node) {
  75.         return node != null && covered.contains(node);
  76.     }    
  77. }
Advertisement
Add Comment
Please, Sign In to add comment