Share the joy
http://www.geeksforgeeks.org/find-the-largest-subtree-in-a-tree-that-is-also-a-bst/
Given a Binary Tree, write a function that returns the size of the largest subtree which is also a Binary Search Tree (BST). If the complete Binary Tree is BST, then return the size of whole tree.
- public class FindLargestBST {
- public static Tree getTree(){
- Tree t50 = new Tree(50);
- Tree t30 = new Tree(30);
- Tree t60 = new Tree(60);
- Tree t5 = new Tree(5);
- Tree t20 = new Tree(20);
- Tree t45 = new Tree(45);
- Tree t70 = new Tree(70);
- Tree t65 = new Tree(65);
- Tree t80 = new Tree(80);
- t50.left = t30;
- t50.right = t60;
- t30.left = t5;
- t30.right = t20;
- t60.left = t45;
- t60.right = t70;
- t70.left = t65;
- t70.right = t80;
- return t50;
- }
- public static Tree getTree2(){
- Tree t1 = new Tree(1);
- Tree t2 = new Tree(2);
- Tree t3 = new Tree(3);
- Tree t4 = new Tree(4);
- Tree t5 = new Tree(5);
- t5.left = t2;
- t5.right = t4;
- t2.left = t1;
- t2.right = t3;
- return t5;
- }
- public static void findLargestBST(Tree tree, LargestBSTData data){
- if(tree==null){
- data.size = 0;
- data.isBST = true;
- data.tree = null;
- return;
- }
- LargestBSTData ldata = new LargestBSTData();
- LargestBSTData rdata = new LargestBSTData();
- findLargestBST(tree.left, ldata);
- findLargestBST(tree.right, rdata);
- //when left-subtree and right-subtree are both BST, check if tree is a BST.
- if(ldata.isBST&&rdata.isBST){
- boolean lBST = false; //if left-subtree and tree can be treated as BST.
- boolean rBST = false; //if right-subtree and tree can be treated as BST.
- if(tree.left==null||tree.left.value<tree.value){
- lBST = true;
- }
- if(tree.right==null||tree.right.value>tree.value){
- rBST = true;
- }
- if(lBST&&rBST){ //tree is a BST
- data.size = ldata.size + rdata.size + 1;
- data.tree = tree;
- data.isBST = true;
- return;
- }
- }
- //tree is not a BST
- data.size = ldata.size>rdata.size?ldata.size:rdata.size;
- data.tree = ldata.size>rdata.size?ldata.tree:rdata.tree;
- data.isBST = false;
- }
- public static void main(String[] args) {
- Tree tree = getTree();
- LargestBSTData data = new LargestBSTData();
- findLargestBST(tree, data);
- System.out.println(data.size);
- }
- }
- class LargestBSTData{
- public Tree tree; //to indicate the largest BST of current tree
- public boolean isBST; //to indicate if current tree is a BST
- public int size; //to indicate the size of the largest BST of current tree
- }