Jianzhi ofrece preguntas de la entrevista 07. Reconstrucción del árbol binario

Dirección del título

https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/submissions/

Ideas

La idea es construir que conoce la raíz es entonces el primer edificio a la izquierda, luego la derecha para construir
primer orden en cada nodo en el mapa para que pueda saber fácilmente el índice de cada nodo
a pre-ordenar los resultados en una matriz Esto se debe a que el nodo raíz puede conocerse a partir del resultado transversal de primer orden. El lado izquierdo del nodo raíz en el recorrido transversal de orden medio es el nodo a la izquierda del árbol binario,
los datos a la derecha son el nodo a la derecha del árbol binario, y luego pueden crearse recursivamente

Código (es hacer un lote de platos de análisis para la respuesta oficial y luego volver a implementarlo ...)

/**
 * @Auther: wwh
 * @Date: 2020-03-12 22:55
 * @Description
 */

class BuildTree {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder == null || preorder.length == 0) {
            return null;
        }
        //把中序的节点放在map里 妙啊
        Map<Integer, Integer> indexMap = new HashMap<Integer, Integer>();
        int length = preorder.length;
        for (int i = 0; i < length; i++) {
            indexMap.put(inorder[i], i);
        }
        TreeNode root = buildTree(preorder, 0, length - 1, inorder, 0, length - 1, indexMap);
        return root;
    }

    public TreeNode buildTree(int[] preorder, int preorderStart, int preorderEnd, int[] inorder, int inorderStart, int inorderEnd, Map<Integer, Integer> indexMap) {
        if (preorderStart > preorderEnd) {
            return null;
        }
        int rootVal = preorder[preorderStart];
        TreeNode root = new TreeNode(rootVal);
        if (preorderStart == preorderEnd) {
            return root;
        } else {
            int rootIndex = indexMap.get(rootVal);
            //左边叶子节点的个数
            int leftNodeSize = rootIndex - inorderStart;
            //右边叶子节点的个数
            int rightNodeSize = inorderEnd - rootIndex;
            TreeNode leftSubtree = buildTree(preorder, preorderStart + 1, preorderStart + leftNodeSize, inorder, inorderStart, rootIndex - 1, indexMap);
            TreeNode rightSubtree = buildTree(preorder, preorderEnd - rightNodeSize + 1, preorderEnd, inorder, rootIndex + 1, inorderEnd, indexMap);
            root.left = leftSubtree;
            root.right = rightSubtree;
            return root;
        }
    }
Publicó 33 artículos originales · elogió 37 · 110,000 visitas

Supongo que te gusta

Origin blog.csdn.net/hagle_wang/article/details/104831197
Recomendado
Clasificación