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;
}
}