Encontré esta pregunta en una entrevista. Dado inorder transversal de un árbol binario. Imprime todos los árboles binarios posibles de él.imprimiendo todos los árboles binarios de inorder transversal
pensamiento inicial:
Si decimos que tenemos sólo 2 elementos de la matriz. Digamos 2,1. Entonces dos árboles son posibles
2
\
1
1
/
2
Si 3 elementos Say, 2,1,4. Entonces tenemos 5 árboles posibles.
2 1 4 2 4
\ /\ / \ /
1 2 4 1 4 2
\ / / \
4 2 1 1
Así que, básicamente si tenemos n elementos, entonces tenemos n-1 ramas (hijos,/o). Podemos organizar estas ramas n-1 en cualquier orden. Para n = 3, n-1 = 2. Entonces, tenemos 2 ramas. Podemos organizar las 2 ramas de las siguientes maneras:
/ \ \ / /\
/ \ / \
intento inicial:
struct node *findTree(int *A,int l,int h)
{
node *root = NULL;
if(h < l)
return NULL;
for(int i=l;i<h;i++)
{
root = newNode(A[i]);
root->left = findTree(A,l,i-1);
root->right = findTree(A,i+1,h);
printTree(root);
cout<<endl;
}
}
En sus ejemplos con (1, 2, 4), ¿el último ejemplo debería ser 4-1-2 de arriba a abajo? –
@ChuckBlumreich la matriz es 2,1,4. Supongo que las cifras son correctas. –
Interesante pregunta, pero no estoy seguro acerca de sus diagramas. Estoy interpretando 'en orden' transversal como 'visitar niños abandonados, visitar el nodo, visitar niños adecuados' (contrastar con la visita previa N, visitar L, visitar R 'y realizar una visita posterior' visitar L, visitar R, visitar NORTE'). Si eso es correcto, entonces los dos árboles para el par '(2, 1)' son '(raíz = 2, R niño = 1)' como diagramados y '(hijo izquierdo = 2, raíz = 1)', que no es lo que has diagramado Tengo preocupaciones similares acerca de los diagramas más complejos, pero puedo estar completamente mal entendiendo algo. –