func caller(preorder []int, inorder []int, indexMap map[int]int,inOrderStart, inOrderEnd, preOrderStart, preOrderEnd int) *TreeNode {
if inOrderEnd < inOrderStart || preOrderEnd < preOrderStart {
return nil
}
rootValue := preorder[preOrderStart]
rootIndex := indexMap[rootValue]
node := &TreeNode{}
node.Val = rootValue
node.Left = caller(preorder, inorder, indexMap, inOrderStart, rootIndex - 1, preOrderStart + 1,
preOrderStart + rootIndex - inOrderStart)
node.Right = caller(preorder, inorder, indexMap, rootIndex + 1, inOrderEnd, preOrderStart + rootIndex - inOrderStart + 1, preOrderEnd)
return node
}
func buildTree(preorder []int, inorder []int) *TreeNode {
indexMap := make(map[int]int)
for index, value := range inorder {
indexMap[value] = index
}
return caller(preorder, inorder, indexMap, 0, len(inorder) - 1, 0, len(inorder) - 1)
}