Construir un árbol binario a partir de dos recorridos de un árbol

tema

Dados dos conjuntos de enteros  y  donde  hay un recorrido en preorden  de un árbol binario un recorrido en orden  del mismo árbol , construya un árbol binario y devuelva su nodo raíz. preorderinorder preorderinorder

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 repetidos
  • inorder Ambos aparecen en preorder
  • preorder Se garantiza  que será la secuencia transversal de preorden de un árbol binario
  • inorder 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 y  postorder dónde  inorder está el recorrido en orden del árbol binario y  postorder 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 ✿✿ヽ(°▽°)ノ✿✿

Supongo que te gusta

Origin blog.csdn.net/m0_73740682/article/details/132308710
Recomendado
Clasificación