题目:
给定两个整数数组,preorder 和 postorder ,其中 preorder 是一个具有 无重复 值的二叉树的前序遍历,postorder 是同一棵树的后序遍历,重构并返回二叉树。
如果存在多个答案,您可以返回其中 任何 一个。
算法:
模拟一遍运行过程,在|的位置分割数组
preorder = [1,|2,4,5|,3,6,7],
postorder = [4,5,2|,6,7,3|,1]
preorder,postorder之后一个元素时,构成一个node节点
func constructFromPrePost(preorder []int, postorder []int) *TreeNode {
var dfs func(preOrderStart, preOrderEnd, postOrderStart, postOrderEnd int) *TreeNode
dfs = func(preOrderStart, preOrderEnd, postOrderStart, postOrderEnd int) *TreeNode {
if preOrderStart > preOrderEnd || postOrderStart > postOrderEnd {
return nil
}
if preOrderStart == preOrderEnd {
return &TreeNode{Val: preorder[preOrderStart] }
}
leftNodeLength := 0
for i := preOrderStart + 1; i <= preOrderEnd; i ++ {
if preorder[i] == postorder[postOrderEnd - 1] {
break
}
leftNodeLength ++
}
// fmt.Println(leftNodeLength, preOrderStart, preOrderEnd, postOrderStart, postOrderEnd )
node := &TreeNode{Val: preorder[preOrderStart]}
node.Left = dfs(preOrderStart + 1, preOrderStart + leftNodeLength, postOrderStart , postOrderStart + leftNodeLength - 1)
node.Right = dfs(preOrderStart + leftNodeLength + 1 ,preOrderEnd , postOrderStart + leftNodeLength, postOrderEnd - 1)
return node
}
return dfs(0, len(preorder) - 1, 0, len(postorder) - 1)
}