Escriba un algoritmo eficiente para construir un árbol binario a partir de la en orden y hacer un pedido secuencia.

Por ejemplo,

Input:
 
Inorder Traversal : { 4, 2, 1, 7, 5, 8, 3, 6 }
Preorder Traversal: { 1, 2, 4, 3, 5, 7, 8, 6 }
 
 
Output: Below binary tree

Difference between sum of nodes

Practice this problem

La idea es comenzar con el nodo raíz, que sería el primer elemento en la secuencia de preorden, y encontrar el límite de su subárbol izquierdo y derecho en la secuencia de orden. Para encontrar el límite, busque el índice del nodo raíz en la secuencia en orden. Todas las claves antes del nodo raíz en la secuencia en orden pasan a formar parte del subárbol izquierdo, y todas las claves después del nodo raíz pasan a formar parte del subárbol derecho. Repita esto recursivamentemente para todos los nodos del árbol y construya el árbol en el proceso.

 
Para ilustrar, considere la siguiente secuencia en orden y preorden:

Inorder  : { 4, 2, 1, 7, 5, 8, 3, 6 }
Preorder : { 1, 2, 4, 3, 5, 7, 8, 6 }

La raíz será el primer elemento en la secuencia de preorden, es decir, 1. A continuación, ubique el índice del nodo raíz en la secuencia en orden. Ya que 1 es el nodo raíz, todos los nodos anteriores 1 en la secuencia en orden debe incluirse en el subárbol izquierdo, es decir, {4, 2} y todos los nodos después 1 debe incluirse en el subárbol derecho, es decir, {7, 5, 8, 3, 6}. Ahora el problema se reduce a construir los subárboles izquierdo y derecho y vincularlos al nodo raíz.

Left subtree:
 
Inorder  : {4, 2}
Preorder : {2, 4}
 
Right subtree:
 
Inorder  : {7, 5, 8, 3, 6}
Preorder : {3, 5, 7, 8, 6}

La idea es seguir recursivamentemente el enfoque anterior hasta que se construya el árbol completo. Esto se demuestra a continuación en C, C++, Java y Python:

C


Descargar  Ejecutar código

Resultado:

The inorder traversal is 4 2 1 7 5 8 3 6
The preorder traversal is 1 2 4 3 5 7 8 6

C++


Descargar  Ejecutar código

Resultado:

The inorder traversal is 4 2 1 7 5 8 3 6
The preorder traversal is 1 2 4 3 5 7 8 6

Java


Descargar  Ejecutar código

Resultado:

The inorder traversal is 4 2 1 7 5 8 3 6
The preorder traversal is 1 2 4 3 5 7 8 6

Python


Descargar  Ejecutar código

Resultado:

The inorder traversal is 4 2 1 7 5 8 3 6
The preorder traversal is 1 2 4 3 5 7 8 6

La complejidad temporal de la solución C++, Java y Python es O(n), dónde n es el número total de nodos en el árbol binario. Ellos requieren O(n) espacio extra para hashing y recursividad. La complejidad temporal de la solución C es O(n2) y requiere O(n) espacio adicional para la pila de llamadas.