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