Find the largest BST in a Binary Tree

By | December 11, 2014
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.

  1. public class FindLargestBST {
  2.     public static Tree getTree(){
  3.         Tree t50 = new Tree(50);
  4.         Tree t30 = new Tree(30);
  5.         Tree t60 = new Tree(60);
  6.         Tree t5 = new Tree(5);
  7.         Tree t20 = new Tree(20);
  8.         Tree t45 = new Tree(45);
  9.         Tree t70 = new Tree(70);
  10.         Tree t65 = new Tree(65);
  11.         Tree t80 = new Tree(80);
  12.         t50.left = t30;
  13.         t50.right = t60;
  14.         t30.left = t5;
  15.         t30.right = t20;
  16.         t60.left = t45;
  17.         t60.right = t70;
  18.         t70.left = t65;
  19.         t70.right = t80;
  20.         return t50;
  21.     }
  22.     public static Tree getTree2(){
  23.         Tree t1 = new Tree(1);
  24.         Tree t2 = new Tree(2);
  25.         Tree t3 = new Tree(3);
  26.         Tree t4 = new Tree(4);
  27.         Tree t5 = new Tree(5);
  28.         t5.left = t2;
  29.         t5.right = t4;
  30.         t2.left = t1;
  31.         t2.right = t3;
  32.         return t5;
  33.     }
  34.     public static void findLargestBST(Tree tree, LargestBSTData data){
  35.         if(tree==null){
  36.             data.size = 0;
  37.             data.isBST = true;
  38.             data.tree = null;
  39.             return;
  40.         }
  41.         LargestBSTData ldata = new LargestBSTData();
  42.         LargestBSTData rdata = new LargestBSTData();
  43.         findLargestBST(tree.left, ldata);
  44.         findLargestBST(tree.right, rdata);
  45.         //when left-subtree and right-subtree are both BST, check if tree is a BST.
  46.         if(ldata.isBST&&rdata.isBST){
  47.             boolean lBST = false;    //if left-subtree and tree can be treated as BST.
  48.             boolean rBST = false;    //if right-subtree and tree can be treated as BST.
  49.             if(tree.left==null||tree.left.value<tree.value){
  50.                 lBST  = true;
  51.             }
  52.             if(tree.right==null||tree.right.value>tree.value){
  53.                 rBST  = true;
  54.             }
  55.             if(lBST&&rBST){    //tree is a BST
  56.                 data.size = ldata.size + rdata.size + 1;
  57.                 data.tree = tree;
  58.                 data.isBST = true;
  59.                 return;
  60.             }
  61.         }
  62.         //tree is not a BST
  63.         data.size = ldata.size>rdata.size?ldata.size:rdata.size;
  64.         data.tree = ldata.size>rdata.size?ldata.tree:rdata.tree;
  65.         data.isBST = false;
  66.     }
  67.     public static void main(String[] args) {
  68.         Tree tree = getTree();
  69.         LargestBSTData data = new LargestBSTData();
  70.         findLargestBST(tree, data);
  71.         System.out.println(data.size);
  72.     }
  73. }
  74. class LargestBSTData{
  75.     public Tree tree;   //to indicate the largest BST of current tree
  76.     public boolean isBST;    //to indicate if current tree is a BST
  77.     public int size;   //to indicate the size of the largest BST of current tree
  78. }