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) }
执行结果如下: