package main
func solve(xianxu []int , zhongxu []int) []int {
tmp := make([]int, 0)
if len(xianxu) == 0 { // 递归终点
return tmp
}
if len(xianxu) == 1 { // 递归终点
return append(tmp, xianxu[0])
}
leftXianxu , rightXianxu , leftzhognxu, rightzhognxu, root := make([]int, 0), make([]int, 0), make([]int, 0), make([]int, 0), 0 //有点费gc
for i := 0; i< len(xianxu);i++ {
if zhongxu[i] == xianxu[0] {
leftXianxu = xianxu[1:i+1]
rightXianxu = xianxu[i+1:]
leftzhognxu = zhongxu[:i]
rightzhognxu = zhongxu[i+1:] // 分别得到左右子树的两种遍历序列
root = xianxu[0]
}
}
tmp = append(tmp, root)
leftRet := solve(leftXianxu, leftzhognxu) // 开始递归
rightRet := solve(rightXianxu, rightzhognxu)
for i, j := 0, 0; i < len(leftRet) || j < len(rightRet); { // 左右子树的右视图,加上root节点,合并下得到当前root开始的右视图
if i >= len(leftRet) {
tmp = append(tmp, rightRet[j:]...)
break
}
if j >= len(rightRet) {
tmp = append(tmp, leftRet[i:]...)
break
}
tmp = append(tmp, rightRet[j])
i++
j++
}
return tmp
}