二叉树Golang语言实现

本文最后更新于 超过 3 年前,文中所描述的信息可能已发生改变。

二叉树(Binary tree)

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分

golang中二叉树定义

go
type BTree struct {
    Data   int
    LBTree *BTree
    RBTree *BTree
}

插入结点

go
// InsertBtreeNode 插入节点
func InsertBtreeNode(tree *BTree, data int) *BTree {
    if tree == nil {
        tree = &BTree{Data: data}
        return tree
    }
    if data > tree.Data {
        tree.RBTree = InsertBtreeNode(tree.RBTree, data)
    } else {
        tree.LBTree = InsertBtreeNode(tree.LBTree, data)
    }
    return tree
}
func NewBtree(data []int) *BTree {
    var tree *BTree
    for _, v := range data {
        tree = InsertBtreeNode(tree, v)
    }
    return tree
}

先序遍历

go
// PreOrder 先序遍历
func PreOrder(tree *BTree, result *[]int) {
    if tree == nil {
        return
    }
    *result = append(*result, tree.Data)
    if tree.LBTree != nil {
        PreOrder(tree.LBTree, result)
    }
    if tree.RBTree != nil {
        PreOrder(tree.RBTree, result)
    }
}

中序遍历

go
// InOrder 中序遍历
func InOrder(tree *BTree, result *[]int) {
    if tree == nil {
        return
    }
    if tree.LBTree != nil {
        InOrder(tree.LBTree, result)
    }
    *result = append(*result, tree.Data)
    if tree.RBTree != nil {
        InOrder(tree.RBTree, result)
    }
}

后序遍历

go
// PostOrder 后序遍历
func PostOrder(tree *BTree, result *[]int) {
    if tree == nil {
        return
    }
    if tree.LBTree != nil {
        PostOrder(tree.LBTree, result)
    }
    if tree.RBTree != nil {
        PostOrder(tree.RBTree, result)
    }
    *result = append(*result, tree.Data)
}

测试代码

go
func main() {
    tree := bst.NewBtree([]int{9, 3, 2, 2, 7, 3, 1, 0, 12, 45})
    var result []int
    bst.PreOrder(tree, &result)
    log.Println("先序遍历 ", result)
    result = []int{}
    bst.InOrder(tree, &result)
    log.Println("中序遍历 ", result)
    result = []int{}
    bst.PostOrder(tree, &result)
    log.Println("后序遍历 ", result)
    result = []int{}
}

测试结果

go
2022/01/08 14:44:13 先序遍历  [9 3 2 2 1 0 3 7 12 45]
2022/01/08 14:44:13 中序遍历  [0 1 2 2 3 3 7 9 12 45]
2022/01/08 14:44:13 后序遍历  [0 1 2 3 2 7 3 45 12 9]
考研常见求导积分公式
Golang实现Floyd算法