2021-08-01:如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,能否不重建树,而直接生成这个二叉树的后序数组并返
2021-08-01:如果只给定一个二叉树前序遍历数组pre和中序遍历数组in,能否不重建树,而直接生成这个二叉树的后序数组并返回。已知二叉树中没有重复值。
福大大 答案2021-08-01:
先序遍历:根左右。
中序遍历:左根右。
先序遍历找到【根】,在中序找到【根】的位置,计算出【左】长度和【右】长度。放在后序遍历相应位置。最后递归。
代码用golang编写。代码如下:
package mainimport "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 - L2process2(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)
