Total number of possible Binary Search Trees and Binary Trees with n keys
Last Updated :
23 Jul, 2025
Given an integer n, the task is to find the total number of unique Binary Search trees And unique Binary trees that can be made using values from 1 to n.
Examples:
Input: n = 3
Output: BST = 5
BT = 30
Explanation: For n = 3, Total number of binary search tree will be 5 and total Binary tree will b 30.
Input: n = 5
Output: BST = 42
BT = 5040
Explanation: For n = 5, Total number of binary search tree will be 42 and total Binary tree will b 5040.
Approach:
1. Unique Binary Search Trees (BSTs):
First let's see how we find Total number of binary search tree with n nodes. A binary search tree (BST) maintains the property that elements are arranged based on their relative order. Let’s define C(n) as the number of unique BSTs that can be constructed with n nodes. This is given by the following recursive formula:
- C(n) = Σ(i = 1 to n) C(i-1) * C(n-i).
This formula corresponds to the recurrence relation for the nth Catalan number. Please refer to Number of Unique BST with N Keys for better understanding and proof. We just need to find nth catalan number. First few catalan numbers are 1 1 2 5 14 42 132 429 1430 4862, … (considered from 0th number).
2. Unique Binary Trees (General Binary Trees):
For general binary trees, the nodes do not have to follow the Binary Search Tree property. The total number of unique binary trees is calculated as: Total Binary Trees = countBST(n) * n!
C++
// C++ code of finding Number of Unique
// BST and BT with N Keys
#include <iostream>
using namespace std;
// Function to calculate the binomial
// coefficient C(n, k)
int binomialCoeff(int n, int k) {
// C(n, k) is the same as C(n, n-k)
if (k > n - k) {
k = n - k;
}
int res = 1;
// Calculate the value of n! / (k! * (n-k)!)
for (int i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
// Function to find the nth Catalan number
int numBST(int n) {
// Calculate C(2n, n)
int c = binomialCoeff(2 * n, n);
// Return the nth Catalan number
return c / (n + 1);
}
// Function to find total binary tree
int numBT(int n) {
int fact = 1;
// Calculating factorial
for(int i = 1; i <= n; i++) {
fact = fact * i;
}
// Total binary tree = Tatal binary search tree * n!
return numBST(n) * fact;
}
int main() {
int n = 5;
cout << numBST(n) << endl;
cout << numBT(n) << endl;
return 0;
}
Java
// Java code of finding Number of Unique
// BST and BT with N Keys
class GfG {
// Function to calculate the binomial coefficient C(n, k)
static int binomialCoeff(int n, int k) {
// C(n, k) is the same as C(n, n-k)
if (k > n - k) {
k = n - k;
}
int res = 1;
// Calculate the value of n! / (k! * (n-k)!)
for (int i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
// Function to find the nth Catalan number
static int numBST(int n) {
// Calculate C(2n, n)
int c = binomialCoeff(2 * n, n);
// Return the nth Catalan number
return c / (n + 1);
}
// Function to find total binary tree
static int numBT(int n) {
int fact = 1;
// Calculating factorial
for (int i = 1; i <= n; i++) {
fact = fact * i;
}
// Total binary tree = Total binary search tree * n!
return numBST(n) * fact;
}
public static void main(String[] args) {
int n = 5;
System.out.println(numBST(n));
System.out.println(numBT(n));
}
}
Python
# Python code of finding Number of Unique
# BST and BT with N Keys
# Function to calculate the binomial coefficient C(n, k)
def binomialCoeff(n, k):
# C(n, k) is the same as C(n, n-k)
if k > n - k:
k = n - k
res = 1
# Calculate the value of n! / (k! * (n-k)!)
for i in range(k):
res *= (n - i)
res //= (i + 1)
return res
# Function to find the nth Catalan number
def numBST(n):
# Calculate C(2n, n)
c = binomialCoeff(2 * n, n)
# Return the nth Catalan number
return c // (n + 1)
# Function to find total binary tree
def numBT(n):
fact = 1
# Calculating factorial
for i in range(1, n + 1):
fact *= i
# Total binary tree = Total binary search tree * n!
return numBST(n) * fact
n = 5
print(numBST(n))
print(numBT(n))
C#
// C# code of finding Number of Unique
// BST and BT with N Keys
using System;
class GfG {
// Function to calculate the binomial coefficient C(n, k)
static int binomialCoeff(int n, int k) {
// C(n, k) is the same as C(n, n-k)
if (k > n - k) {
k = n - k;
}
int res = 1;
// Calculate the value of n! / (k! * (n-k)!)
for (int i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
// Function to find the nth Catalan number
static int numBST(int n) {
// Calculate C(2n, n)
int c = binomialCoeff(2 * n, n);
// Return the nth Catalan number
return c / (n + 1);
}
// Function to find total binary tree
static int numBT(int n) {
int fact = 1;
// Calculating factorial
for (int i = 1; i <= n; i++) {
fact = fact * i;
}
// Total binary tree = Total binary
// search tree * n!
return numBST(n) * fact;
}
static void Main() {
int n = 5;
Console.WriteLine(numBST(n));
Console.WriteLine(numBT(n));
}
}
JavaScript
// JavaScript code of finding Number of Unique
// BST and BT with N Keys
// Function to calculate the binomial coefficient C(n, k)
function binomialCoeff(n, k) {
// C(n, k) is the same as C(n, n-k)
if (k > n - k) {
k = n - k;
}
let res = 1;
// Calculate the value of n! / (k! * (n-k)!)
for (let i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
// Function to find the nth Catalan number
function numBST(n) {
// Calculate C(2n, n)
let c = binomialCoeff(2 * n, n);
// Return the nth Catalan number
return c / (n + 1);
}
// Function to find total binary tree
function numBT(n) {
let fact = 1;
// Calculating factorial
for (let i = 1; i <= n; i++) {
fact *= i;
}
// Total binary tree = Total binary search tree * n!
return numBST(n) * fact;
}
let n = 5;
console.log(numBST(n));
console.log(numBT(n));
Time Complexity: O(n), where n is total number of node
Auxiliary Space: O(1)
Explore
DSA Fundamentals
Data Structures
Algorithms
Advanced
Interview Preparation
Practice Problem