Go实现二叉排序树并四序遍历

写B+树时,受到递归创建binary search tree的启发,于是复习一下bst以及非递归的树遍历算法。
package main

import (
	"container/list"
	"fmt"
	"math/rand"
)

//written by jie_an_shao_zhu_chu_cheng on February 14, 2023

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) {
    
    
	// l r m(reverse m r l)
	//reverse-preOrder
	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)
}

猜你喜欢

转载自blog.csdn.net/weixin_46878177/article/details/129030407