用一个map存储inorder的值和下标的对应关系,这样做的目的可以省略用for查找的时间,直接取preorder[p_start]的值对应在inorder中对应值的下标。
inorder在主要是为了确定以preoder[p_start]为根的的左右子树的长度,便于下次的递归。
边界是:p_start==p_end return null;
递归的逻辑:
root = new TreeNode(pre[pstart]);
root.left = helper(preoder,p_start+1,p_start+left_num+1,inorder,i_start,i_mid,map); //这里下一次的的左子树的起点是p_start+1,终点的下一个结点是真实下标+1,即p_start+left_num+1.然后此时的中序遍历也需要写成左边界。
root.right = helper(preoder,p_start+left_num+1,inorder,mid+1,i_end,map);
return root;