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

Input: inorder = [9,3,15,20,7], postorder = [9,15,7,20,3] Output: [3,9,20,null,null,15,7]
Example 2:
Input: inorder = [-1], postorder = [-1] Output: [-1]
Constraints:
1 <= inorder.length <= 3000postorder.length == inorder.length-3000 <= inorder[i], postorder[i] <= 3000inorderandpostorderconsist of unique values.- Each value of
postorderalso appears ininorder. inorderis guaranteed to be the inorder traversal of the tree.postorderis guaranteed to be the postorder 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[] inorder, int[] postorder) {
Map<Integer,Integer> inMap = new HashMap<>();
for(int i=0;i<inorder.length;i++){
inMap.put(inorder[i],i);
}
return builder(postorder,inorder,0,postorder.length-1,0,inorder.length-1,inMap);
}
public TreeNode builder(int[] postorder, int[] inorder, int preLeft, int preRight, int inLeft, int inRight,
Map<Integer, Integer> inMap) {
if (preLeft > preRight) {
return null;
}
TreeNode root = new TreeNode(postorder[preRight]);
int rootInOrderIndex = inMap.get(postorder[preRight]);
int leftLength = rootInOrderIndex - inLeft;
int rightLength = inRight - rootInOrderIndex;
TreeNode left = builder(postorder, inorder, preLeft, preLeft + leftLength-1, inLeft, rootInOrderIndex - 1,
inMap);
TreeNode right = builder(postorder, inorder, preLeft + leftLength, preRight-1, rootInOrderIndex + 1, inRight,
inMap);
root.left = left;
root.right = right;
return root;
}
}