Golang二叉树重建,先序中序->后序,先序后序->中序,中序后序->先序
根据先序中序->后序,先序后序->中序,中序后序->先序,构建二叉树的方法,注意根据先序后序构建中序并不是唯一的,下面的代码以字符串模拟,若要还原树结构,将关键部分换成node即可
package main
import "fmt"
func prein2post(preorder string, inorder string) string {
if len(preorder) == 0 {
return ""
}
idx := 0
for inorder[idx] != preorder[0] {
idx++
}
ll := prein2post(preorder[1:1+idx], inorder[:idx])
rr := prein2post(preorder[1+idx:], inorder[idx+1:])
return ll + rr + string(preorder[0])
}
func prepost2in(pre string, post string) string {
if len(pre) == 1 {
return pre
}
idx := 0
for post[idx] != pre[1] {
idx++
}
ll := prepost2in(pre[1:1+idx+1], post[0:idx+1])
rr := prepost2in(pre[1+idx+1:], post[1+idx:len(post)-1])
return ll + string(pre[0]) + rr
}
func inpost2pre(in string, post string) string {
if len(post) == 0 {
return ""
}
cur := post[len(post)-1]
idx := 0
for in[idx] != cur {
idx++
}
ll := inpost2pre(in[:idx], post[:idx])
rr := inpost2pre(in[idx+1:], post[idx:len(post)-1])
return string(cur) + ll + rr
}
func main() {
pre := "ABCDE" // A
in := "CBDAE" // B E
post := "CDBEA" // C D
fmt.Println(prein2post(pre, in) == post)
fmt.Println(prepost2in(pre, post) == in)
fmt.Println(inpost2pre(in, post) == pre)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具