Categorías
Algorithms

Construya un árbol binario a partir del recorrido de orden y posorden

Dado el recorrido en orden y posorden de un árbol, construya el árbol binario.

Análisis

Este problema se puede ilustrar con un ejemplo sencillo.

in-order:   4 2 5  (1)  6 7 3 8
post-order: 4 5 2  6 7 8 3  (1)

A partir de la matriz posterior al pedido, sabemos que el último elemento es la raíz. Podemos encontrar la raíz en una matriz ordenada. Luego, podemos identificar los subárboles izquierdo y derecho de la raíz a partir de la matriz en orden.

Usando la longitud del subárbol izquierdo, podemos identificar los subárboles izquierdo y derecho en una matriz posterior al pedido. Recursivamente, podemos construir el árbol.

Para este ejemplo, el árbol construido es:

Solución Java

public TreeNode buildTree(int[] inorder, int[] postorder) {
	int inStart = 0;
	int inEnd = inorder.length - 1;
	int postStart = 0;
	int postEnd = postorder.length - 1;
 
	return buildTree(inorder, inStart, inEnd, postorder, postStart, postEnd);
}
 
public TreeNode buildTree(int[] inorder, int inStart, int inEnd,
		int[] postorder, int postStart, int postEnd) {
	if (inStart > inEnd || postStart > postEnd)
		return null;
 
	int rootValue = postorder[postEnd];
	TreeNode root = new TreeNode(rootValue);
 
	int k = 0;
	for (int i = 0; i < inorder.length; i++) {
		if (inorder[i] == rootValue) {
			k = i;
			break;
		}
	}
 
	root.left = buildTree(inorder, inStart, k - 1, postorder, postStart,
			postStart + k - (inStart + 1));
	// Becuase k is not the length, it it need to -(inStart+1) to get the length
	root.right = buildTree(inorder, k + 1, inEnd, postorder, postStart + k- inStart, postEnd - 1);
	// postStart+k-inStart = postStart+k-(inStart+1) +1
 
	return root;
}
  LeetCode - Flip Game II (Java)

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *