题目:
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
算法:
func buildTree(inorder []int, postorder []int) *TreeNode {
var dfs func(inorderStart, inorderEnd, postorderStart, postorderEnd int) *TreeNode
dfs = func(inorderStart, inorderEnd, postorderStart, postorderEnd int) *TreeNode {
if inorderStart > inorderEnd || postorderStart > postorderEnd {
return nil
}
if inorderStart == inorderEnd {
return &TreeNode{Val: inorder[inorderStart]}
}
leftNodeLeght := 0
for i := inorderStart; i <= inorderEnd; i ++ {
if inorder[i] == postorder[postorderEnd] {
break
}
leftNodeLeght ++
}
node := &TreeNode{Val: postorder[postorderEnd]}
node.Left = dfs(inorderStart, inorderStart + leftNodeLeght - 1, postorderStart, postorderStart + leftNodeLeght - 1)
node.Right = dfs(inorderStart + leftNodeLeght + 1, inorderEnd, postorderStart + leftNodeLeght, postorderEnd - 1)
return node
}
return dfs(0, len(inorder) - 1, 0, len(postorder) - 1)
}