Unique Binary Search Trees
Explicación
La observación crucial es que la respuesta para nodos es el -ésimo número de Catalan.
Demostración
Consideremos un árbol binario de búsqueda (BST) con como raíz. En este caso:
- El subárbol izquierdo tendrá nodos con valores menores que .
- El subárbol derecho tendrá nodos con valores mayores que .
Como resultado, el problema de contar el número de BST únicos con nodos se puede simplificar a contar el número de BST únicos que se pueden construir con nodos en el subárbol izquierdo y nodos en el subárbol derecho.
Sea el número de BST únicos que se pueden formar con nodos. Como la raíz del árbol puede ser cualquiera de los valores, obtenemos la siguiente relación de recurrencia:
que, por inspección, es idéntica a la definición del -ésimo número de Catalan.
Implementación
Complejidad temporal:
class Solution {
public:
long long nCr(int n, int k) {
long long res = 1;
// since C(n, k) = C(n, n - k)
if (k > n - k) { k = n - k; }
for (int i = 0; i < k; i++) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
int numTrees(int n) { return nCr(2 * n, n) / (n + 1); }
};class Solution {
public int numTrees(int n) { return (int)(nCr(2 * n, n) / (long)(n + 1)); }
public long nCr(int n, int k) {
long res = 1;
// since C(n, k) = C(n, n - k)
if (k > n - k) { k = n - k; }
for (int i = 0; i < k; i++) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
}import math
class Solution:
def numTrees(self, n: int) -> int:
res = math.comb(2 * n, n) // (n + 1)
return res