- 思路:
1.前序遍历的第一个节点是二叉树的根节点
2.中序遍历中,根节点左边是左子树,右边是右子树
3.理清思绪递归实现即可
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder) == 0 {
return nil
}
var i = 0
for i < len(preorder) && preorder[0] != inorder[i] {
i++
}
l := buildTree(preorder[1:i+1], inorder[:i])
r := buildTree(preorder[i+1:], inorder[i+1:])
return &TreeNode{
Val: preorder[0],
Left: l,
Right: r,
}
}
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func main() {
var preorder = []int{1,2,4,8,5,9,3,6,7,10}
var inorder = []int{4,8,2,9,5,1,6,3,7,10}
root := buildTree(preorder,inorder)
printLRDTree(root)
}
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder) == 0 {
return nil
}
var i = 0
for i < len(preorder) && preorder[0] != inorder[i] {
i++
}
l := buildTree(preorder[1:i+1], inorder[:i])
r := buildTree(preorder[i+1:], inorder[i+1:])
return &TreeNode{
Val: preorder[0],
Left: l,
Right: r,
}
}
func printVLRTree(root *TreeNode){
if root == nil {
return
}
fmt.Println(root.Val)
printVLRTree(root.Left)
printVLRTree(root.Right)
}
func printLDRTree(root *TreeNode){
if root == nil {
return
}
printLDRTree(root.Left)
fmt.Println(root.Val)
printLDRTree(root.Right)
}
func printLRDTree(root *TreeNode){
if root == nil {
return
}
printLRDTree(root.Left)
printLRDTree(root.Right)
fmt.Println(root.Val)
}