这题上来思路和官方题解的递归一模一样,但是自己就是写不出来
先说下思路 先序第一个结点一定是头结点,在中序中找到头结点的位置,此时在中序序列中头结点的左侧为左子树的全部结点,右侧为右子树的全部结点,而先序序列中野为[{根节点},{左子树}],{右子树}现在就转换成了子问题,每一个树都如此去构建,先构建左子树再构建右子树。
用hashmap存中序结点的下标,节省时间
private Map<Integer, Integer> map = new HashMap<>();
public TreeNode build(int preorder[],int pre_l,int pre_r,int in_l,int in_r){
if (pre_l>pre_r) return null;
int pre_root = pre_l;//在先序中的下标
int in_root = map.get(preorder[pre_root]);//在中序中的下标
int l_len = in_root - in_l;//左子树长度
TreeNode root = new TreeNode(preorder[pre_l]);
//构造左子树
root.left = build(preorder,pre_l+1,pre_l+l_len,in_l,in_root-1);
//构造右子树
root.right = build(preorder,pre_l+l_len+1,pre_r,in_root+1,in_r);
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
int len = preorder.length;
for (int i = 0; i < len; i++) {
map.put(inorder[i],i);
}
return build(preorder,0,len-1,0,len-1);
}