Max subtree in BST in range A and B - Google


http://www.1point3acres.com/bbs/thread-206843-1-1.html
第二题 求一个二叉查找数中,最大的subtree的size。subtree所有元素都必须在范围[A,B]之间。O(n)。
这个题是找最大的满足条件的subtree,一个subtree是必须某个node和其所有子孙nodes. 在判断 “if(left<=root->val&&right>=root->val) {  res=1+left_num+right_num;  }”时,应该先判断left/right subtree是否满足条件再更新res吧。这个help function应该加一个invalid default return value (any negative value is OK),表示该subtree不是在[left, right]范围内的。否则例如对于一个简单的3 nodes的tree:root=1, left node = 100, right node = 100, 范围[0, 2],本来是没有这样的subtree,但原code返回1. 
稍改动加个default value就可以了。

left_sum 和 right_sum应该check是不是-1?是的话说明subtree已经不合法了,然后直接返回-1?最后检测root.val 的时候也应该是如果它不在范围里面直接返回-1?

  1. int Result; // global variable to store node count of max valid subtree
  2. . Waral 鍗氬鏈夋洿澶氭枃绔�,
  3. // main function. Waral 鍗氬鏈夋洿澶氭枃绔�,
  4. int getSubTreeSize(Node* root, int left, int right) {
  5.   Result = -1; // default node count if subtree invalid
  6.   helper(root, left, right);
  7.   return Result;
  8. }
  9. -google 1point3acres
  10. // get node count of subtree rooted at "root" if valid; otherwise, return -1
  11. int helper(Node* root, int left, int right) {
  12.   if (root == NULL) return 0;
  13.   int left_num = helper(root->left, left, right);
  14.   int right_num = helper(root->right, left, right);
  15.   int res = -1; // default node count if subtree invalid
  16.   if (left_num >= 0 && right_num >= 0 && left <= root->val && right >= root->val) {.鐣欏璁哄潧-涓€浜�-涓夊垎鍦�
  17.     res = left_num + right_num + 1; // update node count only if valid
  18.     Result = max(Result, res); // update global result
  19.   }. From 1point 3acres bbs
  20.   return res;
  21. }

  1. //maxsubsize
  2.     public static class TreeNode{
  3.     TreeNode left;
  4.     TreeNode right;
  5.     int val;
  6.     public TreeNode(int val){
  7.       this.val = val;
  8.     } 
  9.   }
  10. static int max = -1;
  11. public static int maxSubsize(int A, int B, TreeNode root){
  12.   if(root == null) return 0;
  13.   if(root.val < A || root.val > B) return -1;.1point3acres缃�
  14.   int left = maxSubsize(A, B, root.left);
  15.   int right = maxSubsize(A, B, root.right);
  16.   if(left == -1 || right == -1){
  17.     return -1;
  18.   }
  19.   if(left != -1 && right != -1){.鐣欏璁哄潧-涓€浜�-涓夊垎鍦�
  20.     max = Math.max(1 + left + right, max);
  21.     return 1 + left + right;.1point3acres缃�
  22.   }
  23.   return -1;
  24. }
Line 14: if(root.val < A || root.val > B) return -1;
这一行不应该立即返回吧。这样如果root node value一旦不在区间[A,B]范围内就不再检查子树范围了。例如给定范围[3,4]和一个3结点的tree: root = 1, left child = 2, right child = 3. 最大subtree size应该是1,不应该返回-1.

Line 17 and Line 19 多余的,请忽略。因为post-order traversal时已经检查过左右child nodes了。
第二题 求一个二叉查找数中,最大的subtree的size in range [A, B]。
因为一个tree的node范围是否在区间[A,B]可以很容易由他的左右子树的范围以及根的value来决定,所以可以用post-order traversal O(N)时间遍历整个tree, 同时注意不断更新最大满足区间范围子树的node count. 注意:在遍历过程中,若判定一个子树满足区间范围时一定要及时记录其node count以备parent trees使用。
  1. // global variables.鐣欏璁哄潧-涓€浜�-涓夊垎鍦�
  2. int low, high; // range low and high bounds.鏈枃鍘熷垱鑷�1point3acres璁哄潧
  3. int maxSubTreeSize = 0; // max subtree size in [low,high]

  4. struct Node {
  5.   int val; Node* left, *right;
  6.   Node(int v) :val(v), left(NULL), right(NULL) {}
  7. };

  8. // true if tree rooted at x is in range [low,high]
  9. // count: node count if tree in range
  10. bool checkRange(Node* x, int& count) { 
  11.   if (!x) { count = 0; return true; }
  12.   int leftCount, rightCount;
  13.   // do post-order traversal to update maxSubTreeSize
  14.   bool leftInRange = checkRange(x->left, leftCount);
  15.   if (leftInRange) maxSubTreeSize = max(maxSubTreeSize, leftCount);
  16.   bool rightInRange = checkRange(x->right, rightCount); 
  17.   if (rightInRange) maxSubTreeSize = max(maxSubTreeSize, rightCount);
  18.   if (leftInRange && rightInRange && x->val >= low && x->val <= high) {. From 1point 3acres bbs
  19.     count = leftCount + rightCount + 1;
  20.     maxSubTreeSize = max(maxSubTreeSize, count);
  21.     return true;
  22.   }
  23.   else return false;
  24. }

  25. int getMaxSubTreeSize(Node* r, int a, int b) {
  26.   low = a; high = b; int count = 0;
  27.   checkRange(r, count);
  28.   return maxSubTreeSize;
  29. }

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts