题目:给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
思路:见代码
代码:
/**
* 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) {
int n = postorder.length;
Map<Integer, Integer> index = new HashMap<>(n);
for (int i = 0; i < n; i++) {
index.put(inorder[i], i);
}
return dfs(postorder, 0, n, 0, n, index);
}
private TreeNode dfs(int[] postorder, int posL, int posR, int inL, int inR, Map<Integer, Integer> index) {
if (posL == posR)
return null;
int leftSize = index.get(postorder[posR - 1]) - inL;
TreeNode left = dfs(postorder, posL, posL + leftSize, inL, inL + leftSize, index);
TreeNode right = dfs(postorder, posL + leftSize, posR - 1, inL + leftSize + 1, inR, index);
return new TreeNode(postorder[posR - 1], left, right);
}
}
性能: