/* * 333.Largest BST Subtree * 2016-3-27 by Mingyang * 这个题目我的思路,自底向上的方法非常正确的!但是,这个题目独特的一点就在于对于一个 * Tree是不是BST得判断,他必须表示对左子树的最大的还大,右子树的最小的还要小,所以这样看来就是 * 必须要保证root必须保存当前子树1.isBST?2.left smallest.3.right biggest.4.node number * 可以先建一个class,也可以做一个array */ public int largestBSTSubtree(TreeNode root) { if( root == null ) return 0; int [] ret = dfs1( root ); return ret[3]; } private int[] dfs1( TreeNode node ) { int[] l = new int[]{ 1, node.val, node.val, 0 }; //isBst, min, max, numNodesBST int[] r = new int[]{ 1, node.val, node.val, 0 }; if( node.left != null ) l = dfs1 ( node.left ); if( node.right != null ) r = dfs1( node.right ); boolean isBst = l[0] == 1 && r[0] == 1 && node.val >= l[2] && node.val <= r[1]; int numBstNodes = isBst ? 1 + l[3] + r[3] : Math.max( l[3], r[3] ); return new int[]{ isBst ? 1 : 0, l[1], r[2], numBstNodes }; }