gtree

    使用场景

    使用方式

    接口文档

    几种容器的API方法都非常类似,特点是需要在初始化时提供用于排序的方法,以下是红黑树的方法列表。

    1. func NewRedBlackTree(comparator func(v1, v2 interface{}) int, unsafe ...bool) *RedBlackTree
    2. func NewRedBlackTreeFrom(comparator func(v1, v2 interface{}) int, data map[interface{}]interface{}, unsafe ...bool) *RedBlackTree
    3. func (tree *RedBlackTree) Ceiling(key interface{}) (ceiling *RedBlackTreeNode)
    4. func (tree *RedBlackTree) Clear()
    5. func (tree *RedBlackTree) Clone(unsafe ...bool) *RedBlackTree
    6. func (tree *RedBlackTree) Contains(key interface{}) bool
    7. func (tree *RedBlackTree) Flip(comparator ...func(v1, v2 interface{}) int)
    8. func (tree *RedBlackTree) Floor(key interface{}) (floor *RedBlackTreeNode)
    9. func (tree *RedBlackTree) Get(key interface{}) (value interface{})
    10. func (tree *RedBlackTree) GetOrSet(key interface{}, value interface{}) interface{}
    11. func (tree *RedBlackTree) GetOrSetFunc(key interface{}, f func() interface{}) interface{}
    12. func (tree *RedBlackTree) GetOrSetFuncLock(key interface{}, f func() interface{}) interface{}
    13. func (tree *RedBlackTree) GetVar(key interface{}) *gvar.Var
    14. func (tree *RedBlackTree) GetVarOrSet(key interface{}, value interface{}) *gvar.Var
    15. func (tree *RedBlackTree) GetVarOrSetFunc(key interface{}, f func() interface{}) *gvar.Var
    16. func (tree *RedBlackTree) GetVarOrSetFuncLock(key interface{}, f func() interface{}) *gvar.Var
    17. func (tree *RedBlackTree) IsEmpty() bool
    18. func (tree *RedBlackTree) Iterator(f func(key, value interface{}) bool)
    19. func (tree *RedBlackTree) IteratorAsc(f func(key, value interface{}) bool)
    20. func (tree *RedBlackTree) IteratorDesc(f func(key, value interface{}) bool)
    21. func (tree *RedBlackTree) Keys() []interface{}
    22. func (tree *RedBlackTree) Left() *RedBlackTreeNode
    23. func (tree *RedBlackTree) Map() map[interface{}]interface{}
    24. func (tree *RedBlackTree) Print()
    25. func (tree *RedBlackTree) Remove(key interface{}) (value interface{})
    26. func (tree *RedBlackTree) Removes(keys []interface{})
    27. func (tree *RedBlackTree) Right() *RedBlackTreeNode
    28. func (tree *RedBlackTree) Search(key interface{}) (value interface{}, found bool)
    29. func (tree *RedBlackTree) Set(key interface{}, value interface{})
    30. func (tree *RedBlackTree) SetIfNotExist(key interface{}, value interface{}) bool
    31. func (tree *RedBlackTree) SetIfNotExistFunc(key interface{}, f func() interface{}) bool
    32. func (tree *RedBlackTree) SetIfNotExistFuncLock(key interface{}, f func() interface{}) bool
    33. func (tree *RedBlackTree) Sets(data map[interface{}]interface{})
    34. func (tree *RedBlackTree) Size() int
    35. func (tree *RedBlackTree) String() string
    36. func (tree *RedBlackTree) Values() []interface{}

    gutil模块中提供了常用的一些基本类型比较方法,可以直接在程序中直接使用,后续也有示例。

    1. package main
    2. import (
    3. "github.com/gogf/gf/container/gtree"
    4. "github.com/gogf/gf/util/gutil"
    5. )
    6. func main() {
    7. m := gtree.NewRedBlackTree(gutil.ComparatorInt)
    8. // 设置键值对
    9. for i := 0; i < 10; i++ {
    10. m.Set(i, i*10)
    11. }
    12. // 查询大小
    13. fmt.Println(m.Size())
    14. // 批量设置键值对(不同的数据类型对象参数不同)
    15. m.Sets(map[interface{}]interface{}{
    16. 10: 10,
    17. 11: 11,
    18. })
    19. fmt.Println(m.Size())
    20. // 查询是否存在
    21. fmt.Println(m.Contains(1))
    22. // 查询键值
    23. fmt.Println(m.Get(1))
    24. // 删除数据项
    25. m.Remove(9)
    26. fmt.Println(m.Size())
    27. // 批量删除
    28. m.Removes([]interface{}{10, 11})
    29. fmt.Println(m.Size())
    30. // 当前键名列表(随机排序)
    31. fmt.Println(m.Keys())
    32. // 当前键值列表(随机排序)
    33. fmt.Println(m.Values())
    34. // 查询键名,当键值不存在时,写入给定的默认值
    35. fmt.Println(m.GetOrSet(100, 100))
    36. fmt.Println(m.Remove(100))
    37. // 遍历map
    38. m.IteratorAsc(func(k interface{}, v interface{}) bool {
    39. fmt.Printf("%v:%v ", k, v)
    40. return true
    41. })
    42. fmt.Println()
    43. // 清空map
    44. m.Clear()
    45. // 判断map是否为空
    46. fmt.Println(m.IsEmpty())
    47. }

    示例2,前序/后续遍历

    1. package main
    2. import (
    3. "fmt"
    4. "github.com/gogf/gf/container/gtree"
    5. "github.com/gogf/gf/util/gutil"
    6. )
    7. func main() {
    8. tree := gtree.NewAVLTree(gutil.ComparatorInt)
    9. for i := 0; i < 10; i++ {
    10. tree.Set(i, i*10)
    11. }
    12. // 打印树形
    13. tree.Print()
    14. // 前序遍历
    15. fmt.Println("ASC:")
    16. tree.IteratorAsc(func(key, value interface{}) bool {
    17. fmt.Println(key, value)
    18. return true
    19. })
    20. // 后续遍历
    21. fmt.Println("DESC:")
    22. tree.IteratorDesc(func(key, value interface{}) bool {
    23. fmt.Println(key, value)
    24. return true
    25. })

    执行后,输出结果为: