/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return buildTreeHelper(preorder,0,preorder.length,inorder,0,inorder.length);
}
//左闭右开
public TreeNode buildTreeHelper(int[] preorder, int p_start,int p_end,int[] inorder,int i_start,int i_end){
//判空
if (p_start == p_end) {
return null;
}
//获取前序的根节点值
int root_val=preorder[p_start];
TreeNode root=new TreeNode(root_val);
//每次中序根节点位置
int i_root_idx=0;
for(int i=i_start;i<i_end;i++){
if(root_val==inorder[i]){
i_root_idx=i;
break;
}
}
int i_plus=i_root_idx-i_start; //每次根节点和左面距离,eg 0,2
//递归的构造左子树,前序从第二个开始,第一个写好了第二个直接写
//注意边界,左闭右开,跳过根节点
root.left=buildTreeHelper(preorder,p_start+1,p_start+i_plus+1,
inorder,i_start,i_root_idx);
//递归的构造右子树
root.right=buildTreeHelper(preorder,p_start+i_plus+1,p_end,
inorder,i_root_idx+1,i_end);
return root;
}
}。
还需优化map