题目
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:
Input: preorder = [-1], inorder = [-1]
Output: [-1]
限制:
0 <= 节点个数 <= 5000
思路:总体递归解决。以前序为基础,将中序分开,具体看代码注释
题解
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder.length == 0) {
return null;
}
return buildTre2(preorder, inorder, 0, preorder.length-1, 0, inorder.length-1);
}
public TreeNode buildTre2(int[] pre, int[] in, int preLeft, int preRight, int inLeft, int inRight) {
//前序左索引大于右索引,则没子树,返回空
if (preLeft > preRight) {
return null;
}
//当前头节点
TreeNode curNode = new TreeNode(pre[preLeft]);
//找到头节点在中序遍历位置,这里的位置可以考虑用全局hashmap存起来
int inTemp = 0;
for (int i = 0;i<in.length;i++) {
if (in[i] == pre[preLeft]) {
inTemp = i;
break;
}
}
//找到左子树的节点数量
int sizeLeftSubtree = inTemp - inLeft;
curNode.left = buildTre2(pre, in, preLeft+1, preLeft + sizeLeftSubtree, inLeft, inTemp-1);
curNode.right = buildTre2(pre, in, preLeft + sizeLeftSubtree + 1, preRight, inTemp+1, inRight);
return curNode;
}