105. Construct Binary Tree from Preorder and Inorder Traversal
2026/1/12大约 1 分钟约 395 字
105. Construct Binary Tree from Preorder and Inorder Traversal
难度: Medium
题目描述
Given two integer arrays preorder and inorder where preorder is the preorder traversal of a binary tree and inorder is the inorder traversal of the same tree, construct and return the binary tree.
Example 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,15,7]
Example 2:
Input: preorder = [-1], inorder = [-1] Output: [-1]
Constraints:
1 <= preorder.length <= 3000inorder.length == preorder.length-3000 <= preorder[i], inorder[i] <= 3000preorderandinorderconsist of unique values.- Each value of
inorderalso appears inpreorder. preorderis guaranteed to be the preorder traversal of the tree.inorderis guaranteed to be the inorder traversal of the tree.
解题思路
代码实现
解决方案
java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
Map<Integer,Integer> inMap = new HashMap<>();
for(int i=0;i<inorder.length;i++){
inMap.put(inorder[i],i);
}
return builder(preorder,inorder,0,preorder.length-1,0,inorder.length-1,inMap);
}
public TreeNode builder(int[] preorder, int[] inorder, int preLeft, int preRight, int inLeft, int inRight,
Map<Integer, Integer> inMap) {
if (preLeft > preRight) {
return null;
}
TreeNode root = new TreeNode(preorder[preLeft]);
int rootInOrderIndex = inMap.get(preorder[preLeft]);
int leftLength = rootInOrderIndex - inLeft;
int rightLength = inRight - rootInOrderIndex;
TreeNode left = builder(preorder, inorder, preLeft + 1, preLeft + leftLength, inLeft, rootInOrderIndex - 1,
inMap);
TreeNode right = builder(preorder, inorder, preLeft + leftLength + 1, preRight, rootInOrderIndex + 1, inRight,
inMap);
root.left = left;
root.right = right;
return root;
}
}