package com.interview.books.leetcode; import com.interview.leetcode.utils.TreeNode; import com.interview.leetcode.utils.TreeNodePrinter; /** * Created_By: stefanie * Date: 14-12-4 * Time: 下午9:38 */ public class LCS11_LargestBSTSubtree { int maxNodes; TreeNode maxRoot; int max, min; //tracking max and min during the post order traverse public TreeNode largestBST(TreeNode root){ maxNodes = 0; maxRoot = null; max = Integer.MIN_VALUE; min = Integer.MAX_VALUE; largest(root); return maxRoot; } private int largest(TreeNode node) { if(node == null) return 0; boolean isBST = true; //visit left part int left = largest(node.left); int curMin = left == 0? node.val : min; if (left == -1 || (left != 0 && node.val <= max)) isBST = false; //visit right part int right = largest(node.right); int curMax = right == 0? node.val : max; if(right == -1 || (right != 0 && node.val >= min)) isBST = false; if (isBST) { min = curMin; max = curMax; int totalNodes = left + right + 1; if (totalNodes > maxNodes) { maxNodes = totalNodes; maxRoot = node; } return totalNodes; } else { return -1; // This subtree is not a BST } } public static void main(String[] args) { LCS11_LargestBSTSubtree finder = new LCS11_LargestBSTSubtree(); TreeNode[] nodes = new TreeNode[21]; for(int i = 0; i < nodes.length; i++) nodes[i] = new TreeNode(i); /** * 15 * 10 20 * 5 7 * 2 5 * 0 8 3 */ nodes[15].left = nodes[10]; nodes[15].right = nodes[20]; nodes[10].left = new TreeNode(5); nodes[10].right = nodes[7]; nodes[7].left = nodes[2]; nodes[7].right = nodes[5]; nodes[2].left = nodes[0]; nodes[2].right = nodes[8]; nodes[5].left = nodes[3]; TreeNode root = nodes[15]; TreeNodePrinter.print(finder.largestBST(root)); System.out.println(finder.maxNodes); } }