写B+树时,受到递归创建binary search tree的启发,于是复习一下bst以及非递归的树遍历算法。
package main
import (
"container/list"
"fmt"
"math/rand"
)
type node struct {
val int
left, right *node
}
func insert(val int, root *node) *node {
if root == nil {
return &node{val, nil, nil}
}
if val < root.val {
root.left = insert(val, root.left)
} else {
root.right = insert(val, root.right)
}
return root
}
func preOrder(t *node) {
stack := make([]*node, 0)
for len(stack) > 0 || t != nil {
if t != nil {
stack = append(stack, t)
fmt.Printf("%v ", t.val)
t = t.left
} else {
t = stack[len(stack)-1]
stack = stack[:len(stack)-1]
t = t.right
}
}
fmt.Println()
}
func inOrder(t *node) {
stack := make([]*node, 0)
for len(stack) > 0 || t != nil {
if t != nil {
stack = append(stack, t)
t = t.left
} else {
t = stack[len(stack)-1]
fmt.Printf("%v ", t.val)
stack = stack[:len(stack)-1]
t = t.right
}
}
fmt.Println()
}
func postOrder(t *node) {
stack := make([]*node, 0)
arr := make([]int, 0)
for len(stack) > 0 || t != nil {
if t != nil {
stack = append(stack, t)
arr = append(arr, t.val)
t = t.right
} else {
t = stack[len(stack)-1]
stack = stack[:len(stack)-1]
t = t.left
}
}
for i := len(arr) - 1; i >= 0; i-- {
fmt.Printf("%v ", arr[i])
}
fmt.Println()
}
func bfs(t *node) {
queue := list.New()
queue.PushBack(t)
for queue.Len() > 0 {
size := queue.Len()
for i := 0; i < size; i++ {
temp := queue.Remove(queue.Front()).(*node)
fmt.Printf("%v ", temp.val)
if temp.left != nil {
queue.PushBack(temp.left)
}
if temp.right != nil {
queue.PushBack(temp.right)
}
}
}
fmt.Println()
}
func main() {
arr := make([]int, 0)
for i := 1; i <= 10; i++ {
arr = append(arr, i)
}
rand.Shuffle(len(arr), func(i, j int) {
arr[i], arr[j] = arr[j], arr[i]
})
fmt.Println(arr)
var root *node
for i := 0; i < len(arr); i++ {
root = insert(arr[i], root)
}
preOrder(root)
inOrder(root)
postOrder(root)
bfs(root)
}