/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
// return array for each node:
// [0] --> min
// [1] --> max
// [2] --> largest BST in its subtree(inclusive)
public int largestBSTSubtree(TreeNode root) {
int[] ret = largestBST(root);
return ret[2];
}
private int[] largestBST(TreeNode node){
if(node == null){
return new int[]{Integer.MAX_VALUE, Integer.MIN_VALUE, 0};
}
int[] left = largestBST(node.left);
int[] right = largestBST(node.right);
if(node.val > left[1] && node.val < right[0]){
return new int[]{Math.min(node.val, left[0]), Math.max(node.val, right[1]), left[2] + right[2] + 1};
}else{
return new int[]{Integer.MIN_VALUE, Integer.MAX_VALUE, Math.max(left[2], right[2])};
}
}
}
This solution is so cool that I feel speechless: