(Java) Construcción del árbol binario OJ question (LeetCode105 construye un árbol binario de acuerdo con el preorden y el orden, LeetCode106 construye el árbol binario de acuerdo con el postorden y el orden)

contenido

1. Construya un árbol binario de acuerdo con el orden previo y el orden interno

2. Construya un árbol binario según el orden posterior y el orden interno.


1. Construya un árbol binario de acuerdo con el orden previo y el orden interno

Construya un árbol binario basado en el recorrido en orden previo y en orden

Pregunta: Dado el recorrido de un árbol en preorden y en orden,  inorder,construya un árbol binario y devuelva su nodo raíz.

P.ej:

Puede hacer clic en el enlace de arriba para ver el tema, el método específico es el siguiente:

Análisis: El nodo raíz se puede obtener del recorrido de orden previo, y las partes del subárbol izquierdo y derecho del nodo de seguimiento se pueden obtener del orden interno. Cuando construimos un árbol binario, encontramos la raíz del orden previo y luego encontramos el partes del subárbol izquierdo y derecho de la raíz en orden primero. Cree el nodo raíz y luego cree el subárbol izquierdo de la raíz y el subárbol derecho de la raíz respectivamente. Este proceso es una recursión, y cada recursión debe determinar qué intervalo en el para encontrar una nueva raíz.

Nota: La secuencia de pedido anticipado es raíz---izquierda---derecha, por lo que al restaurar, es raíz---izquierda---derecha, por lo que se establece index++, el índice es la raíz de la marca de pedido anticipado y el índice comienza desde el principio de la preorden hasta el final

Pasos específicos:

1. Encuentre la raíz en el recorrido de preorden

2. Encuentre la raíz en el recorrido en orden, marque el punto de demarcación con pos, las partes izquierda y derecha de pos son búsqueda recursiva izquierda y búsqueda recursiva derecha

3. Primero restaure el nodo raíz, luego restaure recursivamente el subárbol izquierdo de la raíz y restaure recursivamente el subárbol derecho de la raíz

4. La restauración recursiva se basa en el rango dividido por el recorrido en orden

Código de referencia:

class Solution {
    int index = 0;  //标记前序的根
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return reBuildTree(preorder,inorder,0,inorder.length);
    }
    public TreeNode reBuildTree(int[] preorder,int[] inorder,int left,int right){
        //递归返回条件
        if(index>=preorder.length || left>=right){
            return null;
        }
        int pos = left;
        //在中序中找根的位置
        while(pos < right){
            if(inorder[pos] == preorder[index]){
                break;
            }
            pos++;
        }
        TreeNode root = new TreeNode(preorder[index]);//还原根
        index++;
        root.left = reBuildTree(preorder,inorder,left,pos);//递归还原左
        root.right = reBuildTree(preorder,inorder,pos+1,right);//递归还原右
        return root;
    }
}

2. Construya un árbol binario según el orden posterior y el orden interno.

Construya un árbol binario a partir de postorder y inorder

Pregunta: Construya un árbol binario basado en el recorrido en orden y el recorrido posterior al orden de un árbol.

P.ej:

​ 

Puede hacer clic en el enlace de arriba para ver el tema, el método específico es el siguiente:

Análisis: el recorrido en orden posterior puede determinar el nodo raíz, y el recorrido en orden puede obtener los subárboles izquierdo y derecho del nodo raíz, por lo que también encontramos la posición del nodo raíz en el recorrido en orden, márquelo con pos , y divida el recorrido en orden en dos partes. En estas dos partes, el subárbol izquierdo de la raíz y el subárbol derecho de la raíz se construyen recursivamente, respectivamente.

Nota: El recorrido posterior es izquierda---derecha---raíz, por lo que restauramos hacia atrás al restaurar, y el orden de restauración es: raíz---derecha---izquierda, por lo que se establece el índice-- y el índice es la marca posterior a la raíz, va desde el final de la siguiente hasta el principio

Pasos específicos:

1. Encuentra la raíz del recorrido posterior

2. Encuentre la posición raíz en el orden inverso y use la marca pos para dividir el recorrido inorder en dos partes

3. Restaure recursivamente el subárbol derecho de la raíz en la parte derecha del token pos

4. Restaure recursivamente el subárbol izquierdo de la raíz en la parte izquierda del token pos

Código de referencia:

class Solution {
    int index;  //标记后序遍历的根
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        index = postorder.length-1; //后续的根
        return reBuildTree(inorder,postorder,0,inorder.length);
    }
    public TreeNode reBuildTree(int[] inorder,int[] postorder,int left,int right){
        //递归返回条件
        if(index < 0 || left >= right){
            return null;
        }
        //在中序遍历中找到根的位置
        int pos = left;
        while(pos < right){
            if(postorder[index] == inorder[pos]){
                break;
            }
            pos++;
        }
        //还原根
        TreeNode root = new TreeNode(postorder[index]);
        index--;
        root.right = reBuildTree(inorder,postorder,pos+1,right); //还原根的右
        root.left = reBuildTree(inorder,postorder,left,pos);  //还原根的左
        return root;
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_58710208/article/details/121799006
Recomendado
Clasificación