¡Hay 132 árboles posibles!
Sabemos un hecho de que en el recorrido de orden posterior de un árbol binario visitamos cada nodo de esta manera.
Subárbol izquierdo, Subárbol derecho, Raíz.
- ¿Cómo debería uno responder 'Cuéntanos sobre ti?' en una entrevista de programación?
- ¿Bash es una buena idea para una entrevista de programación de alta tecnología?
- ¿Cómo multiplicaría dos polinomios que tienen un grado de 16 y 17 usando solo 17 multiplicaciones grandes?
- Dada una matriz de n elementos ordenados por el valor absoluto, ¿cómo encuentra dos elementos a + b que se suman a k {1, 3, -4, 6, -8, 12} K = 4 O (n)?
- Si hay una matriz que contiene N números, cuyo rango es de 1 a N + 1, y solo puedo usar el espacio O (1) y no puedo modificar la matriz, ¿puedo encontrar cualquier número repetido no peor que O (NlogN) ¿hora?
Entonces, es seguro que A es la raíz.
Pero, ¿qué pasa con los subárboles izquierdo y derecho?
Estos nodos D, E, B, F, C son los nodos de los subárboles izquierdo y derecho combinados. Pero qué nodos corresponden a qué subárbol es ambiguo. Puede haber muchas formas de dividir los nodos como se muestra a continuación.
Y este problema de ambigüedad es recursivo. Lo que significa nuevamente para los subárboles también habrá muchas formas de dividir sus subárboles.
De esta manera terminamos teniendo muchos árboles posibles. 132 en este caso.
De hecho, no podemos identificar de manera única un árbol solo por su recorrido de orden postal.
Podemos identificar de forma única un árbol si se dan dos de sus recorridos y uno de ellos es Inorder.
Estas combinaciones pueden identificar de manera única un árbol
- Pedido y preorden.
- Inorder y Postorder.
- Orden y nivel de orden.
Estas combinaciones no pueden identificar de forma exclusiva un árbol.
- Postorder y Preorder.
- Pedido anticipado y orden de nivel.
- Postorder y orden de nivel.
Si está interesado en averiguar la cantidad de formas posibles en que podemos construir un árbol usando sus recorridos PostOrder o PreOrder. Aquí está el código que he escrito.
#include
usando el espacio de nombres estándar;
int numberOfTrees (int n) {
if (n == 0 || n == 1) devuelve 1;
int suma = 0;
para (int i = 0; i <n; i ++)
suma + = número de árboles (i) * número de árboles (n-1-i);
suma de retorno;
}
int main () {
int n = 6; // número de nodos en árbol binario
cout << numberOfTrees (n) << endl;
devuelve 0;
}
Fuentes:
Si le dan dos secuencias transversales, ¿puede construir el árbol binario? – GeeksforGeeks
¿Cuántos árboles binarios diferentes son posibles para un recorrido de postorder (o preorder) dado