Given a binary tree, find the largest subtree which is a Binary Search Tree (BST), where largest means subtree with largest number of nodes in it. Note: A subtree must include all of its descendants. Here's an example:
10
/ \
5 15 / \ \ 1 8 7
The Largest BST Subtree in this case is the highlighted one. The return value is the subtree's size, which is 3.
Follow up: Can you figure out ways to solve it with O(n) time complexity?
Solution
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */publicclassSolution {publicclassResult{int count;Integer max;Integer min;publicResult(int count,Integer max,Integer min){this.count= count;this.max= max;this.min= min; } }privateint max =0;publicintlargestBSTSubtree(TreeNode root) { max =0;bstCount(root);return max; }publicResultbstCount(TreeNode root){if(root ==null) returnnewResult(0,null,null);Result left =bstCount(root.left);Result right =bstCount(root.right);boolean valid =left.count!=-1&&right.count!=-1&& (left.max==null||root.val>left.max) && (right.min==null||root.val<right.min);int max =root.val;int min =root.val;if(left.max!=null) max =Math.max(max,left.max);if(right.max!=null) max =Math.max(max,right.max);if(left.min!=null) min =Math.min(min,left.min);if(right.min!=null) min =Math.min(min,right.min);int count = valid ?left.count+right.count+1:-1;this.max=Math.max(this.max, count);returnnewResult(count, max, min); }// //return nodes count if it is bst, else return -1// private int bstCount(TreeNode root){// if(root == null) return 0;// int count = 0;// int leftCount = bstCount(root.left);// boolean isValid = (prev == null || prev.val < root.val);// prev = root;// int rightCount = bstCount(root.right);// if(leftCount != -1 && isValid && rightCount != -1){// count = leftCount + 1 + rightCount;// }// else{// count = -1;// }// max = Math.max(max, count);// return count;// }}