gtree
使用场景:
使用方式:
接口文档:
几种容器的API方法都非常类似,特点是需要在初始化时提供用于排序的方法,以下是红黑树的方法列表。
func NewRedBlackTree(comparator func(v1, v2 interface{}) int, unsafe ...bool) *RedBlackTree
func NewRedBlackTreeFrom(comparator func(v1, v2 interface{}) int, data map[interface{}]interface{}, unsafe ...bool) *RedBlackTree
func (tree *RedBlackTree) Ceiling(key interface{}) (ceiling *RedBlackTreeNode)
func (tree *RedBlackTree) Clear()
func (tree *RedBlackTree) Clone(unsafe ...bool) *RedBlackTree
func (tree *RedBlackTree) Contains(key interface{}) bool
func (tree *RedBlackTree) Flip(comparator ...func(v1, v2 interface{}) int)
func (tree *RedBlackTree) Floor(key interface{}) (floor *RedBlackTreeNode)
func (tree *RedBlackTree) Get(key interface{}) (value interface{})
func (tree *RedBlackTree) GetOrSet(key interface{}, value interface{}) interface{}
func (tree *RedBlackTree) GetOrSetFunc(key interface{}, f func() interface{}) interface{}
func (tree *RedBlackTree) GetOrSetFuncLock(key interface{}, f func() interface{}) interface{}
func (tree *RedBlackTree) GetVar(key interface{}) *gvar.Var
func (tree *RedBlackTree) GetVarOrSet(key interface{}, value interface{}) *gvar.Var
func (tree *RedBlackTree) GetVarOrSetFunc(key interface{}, f func() interface{}) *gvar.Var
func (tree *RedBlackTree) GetVarOrSetFuncLock(key interface{}, f func() interface{}) *gvar.Var
func (tree *RedBlackTree) IsEmpty() bool
func (tree *RedBlackTree) Iterator(f func(key, value interface{}) bool)
func (tree *RedBlackTree) IteratorAsc(f func(key, value interface{}) bool)
func (tree *RedBlackTree) IteratorDesc(f func(key, value interface{}) bool)
func (tree *RedBlackTree) Keys() []interface{}
func (tree *RedBlackTree) Left() *RedBlackTreeNode
func (tree *RedBlackTree) Map() map[interface{}]interface{}
func (tree *RedBlackTree) Print()
func (tree *RedBlackTree) Remove(key interface{}) (value interface{})
func (tree *RedBlackTree) Removes(keys []interface{})
func (tree *RedBlackTree) Right() *RedBlackTreeNode
func (tree *RedBlackTree) Search(key interface{}) (value interface{}, found bool)
func (tree *RedBlackTree) Set(key interface{}, value interface{})
func (tree *RedBlackTree) SetIfNotExist(key interface{}, value interface{}) bool
func (tree *RedBlackTree) SetIfNotExistFunc(key interface{}, f func() interface{}) bool
func (tree *RedBlackTree) SetIfNotExistFuncLock(key interface{}, f func() interface{}) bool
func (tree *RedBlackTree) Sets(data map[interface{}]interface{})
func (tree *RedBlackTree) Size() int
func (tree *RedBlackTree) String() string
func (tree *RedBlackTree) Values() []interface{}
在gutil
模块中提供了常用的一些基本类型比较方法,可以直接在程序中直接使用,后续也有示例。
package main
import (
"github.com/gogf/gf/container/gtree"
"github.com/gogf/gf/util/gutil"
)
func main() {
m := gtree.NewRedBlackTree(gutil.ComparatorInt)
// 设置键值对
for i := 0; i < 10; i++ {
m.Set(i, i*10)
}
// 查询大小
fmt.Println(m.Size())
// 批量设置键值对(不同的数据类型对象参数不同)
m.Sets(map[interface{}]interface{}{
10: 10,
11: 11,
})
fmt.Println(m.Size())
// 查询是否存在
fmt.Println(m.Contains(1))
// 查询键值
fmt.Println(m.Get(1))
// 删除数据项
m.Remove(9)
fmt.Println(m.Size())
// 批量删除
m.Removes([]interface{}{10, 11})
fmt.Println(m.Size())
// 当前键名列表(随机排序)
fmt.Println(m.Keys())
// 当前键值列表(随机排序)
fmt.Println(m.Values())
// 查询键名,当键值不存在时,写入给定的默认值
fmt.Println(m.GetOrSet(100, 100))
fmt.Println(m.Remove(100))
// 遍历map
m.IteratorAsc(func(k interface{}, v interface{}) bool {
fmt.Printf("%v:%v ", k, v)
return true
})
fmt.Println()
// 清空map
m.Clear()
// 判断map是否为空
fmt.Println(m.IsEmpty())
}
示例2,前序/后续遍历
package main
import (
"fmt"
"github.com/gogf/gf/container/gtree"
"github.com/gogf/gf/util/gutil"
)
func main() {
tree := gtree.NewAVLTree(gutil.ComparatorInt)
for i := 0; i < 10; i++ {
tree.Set(i, i*10)
}
// 打印树形
tree.Print()
// 前序遍历
fmt.Println("ASC:")
tree.IteratorAsc(func(key, value interface{}) bool {
fmt.Println(key, value)
return true
})
// 后续遍历
fmt.Println("DESC:")
tree.IteratorDesc(func(key, value interface{}) bool {
fmt.Println(key, value)
return true
})
执行后,输出结果为: