package com.interview.books.leetcode; import com.interview.leetcode.utils.TreeNode; import com.interview.leetcode.utils.TreeNodePrinter; /** * Created_By: stefanie * Date: 14-12-11 * Time: 下午4:50 */ public class LCS12_LargestBST { int maxNodes; TreeNode child; TreeNode largestBST; public TreeNode largestBST(TreeNode root){ maxNodes = 0; child = null; largest(root, Integer.MIN_VALUE, Integer.MAX_VALUE); return largestBST; } private int largest(TreeNode node, int min, int max){ if(node == null) return 0; if(node.val < min || node.val > max){ largest(node, Integer.MIN_VALUE, Integer.MAX_VALUE); return 0; } else { TreeNode parent = new TreeNode(node.val); int left = largest(node.left, min, node.val); parent.left = left == 0? null: child; int right = largest(node.right, node.val, max); parent.right = right == 0? null: child; int totalNodes = left + right + 1; if (totalNodes > maxNodes) { maxNodes = totalNodes; largestBST = parent; } child = parent; return totalNodes; } } public static void main(String[] args){ 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]; LCS12_LargestBST finder = new LCS12_LargestBST(); TreeNode node = finder.largestBST(root); //4 TreeNodePrinter.print(node); System.out.println(finder.maxNodes); } }