Skip to main content

Size of Largest BST in Binary Tree (GFG)

Description

The Size of Largest BST in Binary Tree problem is based on determining whether the subtree rooted at each node is a Binary Search Tree (BST). If any node follows the properties of a BST and has the maximum size, we update the size of the largest BST.

Problem Definition

Given:

  • A binary tree

Objective:

  • Find the size of largest BST in tree

Algorithm Overview

  1. Recursion Approach:
  • Create a structure to store the minimum value, maximum value, and size of the largest BST for any given subtree.
  • Implement a recursive function that traverse through the binary tree.
  • For each node, first, recursively gather information from its left and right children.
  • For each node, check whether the current subtree is a BST by comparing the node’s value with the maximum of the left subtree and the minimum of the right subtree.
  • If the conditions are satisfied, update the size of the largest BST found by combining the sizes of the valid left and right subtrees with the current node.
  • As the recursive calls return, keep track of the largest BST size. - Finally, after traversing the entire tree, return the size of the largest BST found.
  1. Return size, which indicates the size of the largest BST found.

Time Complexity

  • Time Complexity: O(N) as we have to traverse throughout the tree consisting of N nodes.
  • Space Complexity: O(N) for auxiliary stack space storing all the recursive calls.

C++ Implementation

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
class Node {
public:
int data;
Node *left;
Node *right;

Node(int val) {
data = val;
left = nullptr;
right = nullptr;
}
};

// Information about the subtree: Minimum value,
// Maximum value, and Size of the largest BST
class BSTInfo {
public:
int min;
int max;
int mxSz;

BSTInfo(int mn, int mx, int sz) {
min = mn;
max = mx;
mxSz = sz;
}
};

// Function to determine the largest BST in the binary tree
BSTInfo largestBSTBT(Node *root) {
if (!root)
return BSTInfo(INT_MAX, INT_MIN, 0);

BSTInfo left = largestBSTBT(root->left);
BSTInfo right = largestBSTBT(root->right);

// Check if the current subtree is a BST
if (left.max < root->data && right.min > root->data) {
return BSTInfo(min(left.min, root->data),
max(right.max, root->data), 1 + left.mxSz + right.mxSz);
}

return BSTInfo(INT_MIN, INT_MAX, max(left.mxSz, right.mxSz));
}

// Function to return the size of the largest BST
int largestBST(Node *root) {
return largestBSTBT(root).mxSz;
}

};