tema
Dados dos conjuntos de enteros y donde hay un recorrido en preorden de un árbol binario y un recorrido en orden del mismo árbol , construya un árbol binario y devuelva su nodo raíz. preorder
inorder
preorder
inorder
Ejemplo 1:
Entrada: pedido anticipado = [3,9,20,15,7], orden = [9,3,15,20,7]
Salida: [3,9,20,null,null,15,7]
Ejemplo 2:
Entrada: pedido anticipado = [-1], orden interna = [-1]
Salida: [-1]
pista:
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder
y no tenerinorder
elementos repetidosinorder
Ambos aparecen enpreorder
preorder
Se garantiza que será la secuencia transversal de preorden de un árbol binarioinorder
Se garantiza que será una secuencia transversal en orden de un árbol binario
Conocimientos previos:
preorder
: Recorrido de preorden (el recorrido de preorden también se conoce como recorrido de preorden): visite el nodo raíz ---> el subárbol izquierdo de la raíz ---> el subárbol derecho de la raíz.
inorder:
Inorder Traversal (Inorder Traversal): el subárbol izquierdo de la raíz ---> nodo raíz ---> el subárbol derecho de la raíz
El primer nodo obtenido mediante el recorrido de preorden es el nodo raíz, por lo que se puede utilizar para determinar la posición del nodo raíz en el recorrido de orden.
Luego, de acuerdo con el recorrido en orden, el lado izquierdo del nodo raíz es el árbol izquierdo de este árbol binario, y el lado derecho del nodo raíz es el árbol derecho de este árbol binario de clase para construir este árbol binario de clase.
Tome el ejemplo 1 como ejemplo para hablar sobre la comprensión del tema.
Entrada del ejemplo 1 : pedido anticipado = [3,9,20,15,7], orden interna = [9,3,15,20,7]
preorder = [ 3 , 9, 20, 15, 7 ] 3 es el nodo raíz de este árbol binario
inorder = [ 9 , 3 , 15, 20, 7 ] 9 es el árbol izquierdo de la raíz y solo hay un nodo, por lo que 9 es el nodo izquierdo de la raíz
Los tres nodos 15, 20 y 7 son el árbol derecho de la raíz, y luego atraviesan el subárbol izquierdo de la raíz ---> nodo raíz ---> el subárbol derecho de la raíz según el orden medio
El nodo derecho de la raíz es el nodo 20, el nodo izquierdo del nodo 20 es el nodo 15 y el nodo derecho es el nodo 7
Haga un dibujo para demostrar la descripción del texto anterior.
Ideas para resolver problemas:
De acuerdo con el orden de los nodos del recorrido de preorden dado por el título, recurra en el recorrido en orden para construir un árbol binario
1. De acuerdo con el recorrido de pedido previo, encuentre la posición del nodo raíz iRoot del recorrido en orden, cree el nodo raíz y luego determine las posiciones de iBegin, iEnd, i++;
2. Juzgue las posiciones de iBegin e iEnd. Cuando iBegin>iEnd devuelve nulo y la recursividad comienza a retroceder;
2. En el recorrido en orden, de acuerdo con las posiciones de iRoot, iBegin e iEnd, construya el árbol izquierdo y el árbol derecho;
Repita los tres pasos anteriores. Una vez completada la recursión, se construye el árbol binario y regresa a la raíz del nodo raíz.
Nota: El uso de los nodos obtenidos mediante el recorrido de preorden es el alma del código en esta pregunta.
Gráfico:
código de resolución de problemas
class Solution {
public int i = 0;
public TreeNode buildTree(int[] preorder, int[] inorder) {
return create_a_binary_tree(preorder, inorder, 0, inorder.length - 1);
}
public TreeNode create_a_binary_tree(int[] preorder, int[] inorder, int inBegin, int inEnd) {
if (inBegin > inEnd) {
return null;
//给定的数组int[] preorder, int[] inorder,遍历完了,没有子树了,该节点为空节点,返回null,递归开始回退
}
//先根据先序遍历创建根节点
TreeNode root = new TreeNode(preorder[i]);
//找到当前根节点,在中序遍历的位置
int rootIndex = findIndex(inorder, inBegin, inEnd, preorder[i]);
i++;
//递归构建左树
root.left = create_a_binary_tree(preorder, inorder, inBegin, rootIndex - 1);
//递归构建右树
root.right = create_a_binary_tree(preorder, inorder, rootIndex + 1, inEnd);
//前序遍历完成,返回根节点
return root;
}
private int findIndex(int[] inorder, int inBegin, int inEnd, int key) {
for (int j = inBegin; j <= inEnd; j++) {
if (inorder[j] == key) {
return j;
}
}
return -1;
}
}
resultado de la operación
enlace del tema
https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/submissions/
Levanta uno, voltea tres y haz uno más
Construya un árbol binario basado en el recorrido en orden y en el recorrido posterior al orden de un árbol
Dadas dos matrices de enteros
inorder
ypostorder
dóndeinorder
está el recorrido en orden del árbol binario ypostorder
el recorrido en postorden del mismo árbol, construya y devuelva este árbol binario .
Ejemplo 1:
Entrada: orden interna = [9,3,15,20,7], orden posterior = [9,15,7,20,3]
Salida: [3,9,20, nulo, nulo, 15,7]
Ejemplo 2:
Entrada: orden interna = [-1], orden posterior = [-1]
Salida: [-1]
Recorrido posterior al orden (Recorrido posterior al orden): el subárbol izquierdo de la raíz ---> el subárbol derecho de la raíz ---> el nodo raíz.
Después de crear el nodo raíz, primero cree el número correcto y luego cree el árbol izquierdo
Explique según el ejemplo 1. La siguiente figura es el proceso recursivo del código.
Con la recursividad del código, el proceso de construcción del árbol binario.
código de resolución de problemas
public class Solution {
public int i = 0;
public TreeNode buildTree(int[] inorder, int[] postorder) {
i = postorder.length - 1;
return create_a_binary_tree(postorder, inorder, 0, inorder.length - 1);
}
public TreeNode create_a_binary_tree(int[] postorder, int[] inorder, int inBegin, int inEnd) {
if (inBegin > inEnd) {
return null;
//给定的数组int[] postorder, int[] inorder,遍历完了,没有子树了,该节点为空节点,返回null,递归开始回退
}
//先根据先序遍历创建根节点
TreeNode root = new TreeNode(postorder[i]);
//找到当前根节点,在中序遍历的位置
int rootIndex = findIndex(inorder, inBegin, inEnd, postorder[i]);
i--;
//递归先构建右树
root.right = create_a_binary_tree(postorder, inorder, rootIndex + 1, inEnd);
//递归后构建左树
root.left = create_a_binary_tree(postorder, inorder, inBegin, rootIndex - 1);
//前序遍历完成,返回根节点
return root;
}
private int findIndex(int[] inorder, int inBegin, int inEnd, int key) {
for (int j = inBegin; j <= inEnd; j++) {
if (inorder[j] == key) {
return j;
}
}
return -1;
}
}
resultado de la operación
Enlace del tema:
https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/submissions/
Flor completa ✿✿ヽ(°▽°)ノ✿✿