package main
import (
"fmt"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// 创建二叉树
func buildTree(nodes [][]int, idx int) *TreeNode {
if idx == 0 {
return nil
}
node := &TreeNode{Val: idx}
leftChild, rightChild := nodes[idx-1][0], nodes[idx-1][1]
node.Left = buildTree(nodes, leftChild)
node.Right = buildTree(nodes, rightChild)
return node
}
// 中序遍历二叉树(根-左-右)
func preorderTraversal(root *TreeNode) {
if root != nil {
fmt.Print(root.Val, " ")
preorderTraversal(root.Left)
preorderTraversal(root.Right)
}
}
// 中序遍历二叉树(左-根-右)
func InOrderTraversal(root *TreeNode) {
if root != nil {
InOrderTraversal(root.Left)
fmt.Print(root.Val, " ")
InOrderTraversal(root.Right)
}
}
// 后序遍历二叉树(左-右-根)
func postorderTraversal(root *TreeNode) {
if root != nil {
postorderTraversal(root.Left)
postorderTraversal(root.Right)
fmt.Print(root.Val, " ")
}
}
func main() {
var n int
fmt.Scan(&n)
nodes := make([][]int, n)
for i := 0; i < n; i++ {
var l, r int
fmt.Scan(&l, &r)
nodes[i] = []int{l, r}
}
// 根据给定信息建立二叉树
root := buildTree(nodes, 1)
preorderTraversal(root)
fmt.Println()
InOrderTraversal(root)
fmt.Println()
postorderTraversal(root)
}
下面换一种输入数据的方式
package main
import (
"bufio"
"fmt"
"os"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// 创建二叉树
func buildTree(nodes [][]int, idx int) *TreeNode {
if idx == 0 {
return nil
}
node := &TreeNode{Val: idx}
leftChild, rightChild := nodes[idx-1][0], nodes[idx-1][1]
node.Left = buildTree(nodes, leftChild)
node.Right = buildTree(nodes, rightChild)
return node
}
// 中序遍历二叉树(根-左-右)
func preorderTraversal(root *TreeNode) {
if root != nil {
fmt.Fprintf(writer, "%d ", root.Val)
preorderTraversal(root.Left)
preorderTraversal(root.Right)
}
}
// 中序遍历二叉树(左-根-右)
func InOrderTraversal(root *TreeNode) {
if root != nil {
InOrderTraversal(root.Left)
fmt.Fprintf(writer, "%d ", root.Val)
InOrderTraversal(root.Right)
}
}
// 后序遍历二叉树(左-右-根)
func postorderTraversal(root *TreeNode) {
if root != nil {
postorderTraversal(root.Left)
postorderTraversal(root.Right)
fmt.Fprintf(writer, "%d ", root.Val)
}
}
var (
reader = bufio.NewReader(os.Stdin)
writer = bufio.NewWriter(os.Stdout)
)
func main() {
var n int
defer writer.Flush()
fmt.Fscanf(reader, "%d\n", &n)
nodes := make([][]int, n)
for i := 0; i < n; i++ {
var l, r int
fmt.Fscanf(reader, "%d %d\n", &l, &r)
nodes[i] = []int{l, r}
}
// 根据给定信息建立二叉树
root := buildTree(nodes, 1)
preorderTraversal(root)
fmt.Fprintln(writer)
InOrderTraversal(root)
fmt.Fprintln(writer)
postorderTraversal(root)
}