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代码