——————————————————————————————————————————————————
参考的大佬题解
用 inMap 记录中序遍历中各元素及其下标,可以快速获取根节点在中序数组的下标
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Map<Integer, Integer> inMap = new HashMap<>();
int[] preArr;
int[] inArr;
int len;
public TreeNode buildTree(int[] preorder, int[] inorder) {
preArr = preorder;//改成全局变量,这样helper的参数可以少一些
inArr = inorder;
len = inorder.length;
for(int i = 0;i < len;i++) inMap.put(inorder[i], i);
TreeNode tree = helper(0, 0, len - 1);
return tree;
}
/**
*
* @param pre_root 当前二叉树根节点在前序数组的索引
* @param in_left 当前二叉树在中序数组的左边界
* @param in_right 当前二叉树在中序数组的右边界
* @return
*/
private TreeNode helper(int pre_root, int in_left, int in_right) {
if(in_left > in_right) return null;
TreeNode root = new TreeNode(preArr[pre_root]);
Integer i = inMap.get(preArr[pre_root]);//根节点在中序数组的索引
root.left = helper(pre_root + 1, in_left, i - 1);
//i-in_left就是左子树的长度,根节点往右移i - in_left + 1次就是右子树根节点在前序数组的索引
root.right = helper(pre_root + i - in_left + 1, i + 1, in_right);
return root;
}
}