class Solution {
// 使用一个哈希表存储中序遍历中每个值对应的索引,方便查找
Map<Integer, Integer> inorderMap = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
// 遍历中序数组,将值和索引存入哈希表
for (int i = 0; i < inorder.length; i++) {
inorderMap.put(inorder[i], i);
}
// 调用递归函数,传入前序数组,中序数组,以及各自的起始和结束位置
return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
}
private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) {
// 如果前序或中序数组为空,返回null
if (preStart > preEnd || inStart > inEnd) {
return null;
}
// 前序数组的第一个元素是根节点的值
int rootVal = preorder[preStart];
// 创建根节点
TreeNode root = new TreeNode(rootVal);
// 在中序数组中找到根节点的索引
int inRoot = inorderMap.get(rootVal);
// 计算左子树的节点个数
int leftSize = inRoot - inStart;
// 递归构造左子树,更新前序和中序数组的起始和结束位置
root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, inRoot - 1);
// 递归构造右子树,更新前序和中序数组的起始和结束位置
root.right = buildTree(preorder, inorder, preStart + leftSize + 1, preEnd, inRoot + 1, inEnd);
// 返回根节点
return root;
}
}