vlambda博客
学习文章列表

2021-08-01:如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,能否不重建树,而直接生成这个二叉树的后序数组并返

2021-08-01:如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,能否不重建树,而直接生成这个二叉树的后序数组并返回。已知二叉树中没有重复值。


福大大 答案2021-08-01:


先序遍历:根左右。

中序遍历:左根右。

先序遍历找到【根】,在中序找到【根】的位置,计算出【左】长度和【右】长度。放在后序遍历相应位置。最后递归。


代码用golang编写。代码如下:

package main
import "fmt"
func main() { pre := []int{1, 2, 3} in := []int{2, 1, 3} ret := preInToPos2(pre, in) fmt.Println(ret)}
func preInToPos2(pre []int, in []int) []int { if pre == nil || in == nil || len(pre) != len(in) { return nil } N := len(pre) inMap := make(map[int]int) for i := 0; i < N; i++ { inMap[in[i]] = i } pos := make([]int, N) process2(pre, 0, N-1, in, 0, N-1, pos, 0, N-1, inMap) return pos}
func process2(pre []int, L1 int, R1 int, in []int, L2 int, R2 int, pos []int, L3 int, R3 int, inMap map[int]int) { if L1 > R1 { return } if L1 == R1 { pos[L3] = pre[L1] return } pos[R3] = pre[L1] mid := inMap[pre[L1]] leftSize := mid - L2 process2(pre, L1+1, L1+leftSize, in, L2, mid-1, pos, L3, L3+leftSize-1, inMap) process2(pre, L1+leftSize+1, R1, in, mid+1, R2, pos, L3+leftSize, R3-1, inMap)}

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/coding-for-great-offer/blob/main/src/class20/Code01_PreAndInArrayToPosArray.java)