avl

package
v0.3.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 7, 2023 License: MIT Imports: 2 Imported by: 0

Documentation

Overview

Package avl implements an easy-to-use AVL tree in Golang.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func DebugPreorder

func DebugPreorder(t *Tree) (ret []interface{})

DebugPreorder will traverse the tree in preorder. For debug-use only.

Types

type BytesTree

type BytesTree Tree

BytesTree is a high-performance AVL tree for []byte.

func (*BytesTree) Insert

func (t *BytesTree) Insert(val []byte)

Insert a new Range into the AVL tree.

func (*BytesTree) Search

func (t *BytesTree) Search(val []byte) bool

Search returns true if the AVL tree contains the <val>.

type ITree added in v0.2.0

type ITree[T any] interface {
	Insert(T)
	Search(T) bool
}

ITree is an AVL tree implement with type parameters support.

func NewOrderedTree added in v0.2.0

func NewOrderedTree[T constraints.Ordered]() ITree[T]

NewOrderedTree creates a new high-performance AVL tree instance for ordered types, such as integer, float, and string.

Example (Int)
package main

import (
	"fmt"

	"github.com/sym01/algo/avl"
)

func main() {
	ints := []int{
		9, 85, 45, 76, 53, 52, 66, 12, 13, 65,
		98, 33, 28, 42, 38, 84, 24, 37, 36, 35,
		27, 41, 77, 48, 46, 81, 78, 60, 25, 5,
		3, 93, 11, 49, 74, 96, 94, 39, 51, 95,
		58, 90, 91, 20, 7, 44, 97, 29, 2, 8,
		19, 14, 86, 61, 54, 79, 64, 16, 67, 6,
		26, 73, 50, 72, 10, 83, 70, 80, 89, 15,
		17, 4, 100, 71, 55, 75, 69, 87, 34, 92,
		43, 18, 88, 82, 30, 57, 23, 99, 59, 21,
		32, 22, 68, 56, 47, 40, 63, 62, 1, 31,
	}

	tree := avl.NewOrderedTree[int]()
	for _, i := range ints {
		tree.Insert(i)
	}

	fmt.Println(tree.Search(42))
	fmt.Println(tree.Search(96))
	fmt.Println(tree.Search(1024))

}
Output:

true
true
false
Example (String)
package main

import (
	"fmt"

	"github.com/sym01/algo/avl"
)

func main() {
	strs := []string{
		"eKSI9wZlde",
		"j1ORx3W0ph",
		"1Lw7uwm4VS",
		"WcOTlexQqG",
		"hqDGapsHq1",
		"mDy5mwwNzx",
		"VhY3HfqmG5",
		"Y5doxlrZe6",
		"VbR2pKkv9E",
		"OpUWxSI2eP",
		"Ja6CqjnFq5",
		"h6dlJ5m",
		"PBBKZnRBYu",
		"AgX3njkaZT",
		"ytXkDnD0vr",
		"8QJFS2fLGd",
		"PAarEfdt1w", // same string
		"PAarEfdt1w", // same string
		"PAarEfdt1w", // same string
		"8QJFS2fLGd",
	}

	tree := avl.NewOrderedTree[string]()
	for _, s := range strs {
		tree.Insert(s)
	}

	for _, s := range strs {
		if !tree.Search(s) {
			fmt.Printf("%s not in tree\n", s)
		}
	}

	s := "abccc"
	if !tree.Search(s) {
		fmt.Printf("%s not in tree\n", s)
	}

}
Output:

abccc not in tree

type IntTree

type IntTree Tree

IntTree is a high-performance AVL tree for int.

Example
package main

import (
	"fmt"

	"github.com/sym01/algo/avl"
)

func main() {
	ints := []int{
		9, 85, 45, 76, 53, 52, 66, 12, 13, 65,
		98, 33, 28, 42, 38, 84, 24, 37, 36, 35,
		27, 41, 77, 48, 46, 81, 78, 60, 25, 5,
		3, 93, 11, 49, 74, 96, 94, 39, 51, 95,
		58, 90, 91, 20, 7, 44, 97, 29, 2, 8,
		19, 14, 86, 61, 54, 79, 64, 16, 67, 6,
		26, 73, 50, 72, 10, 83, 70, 80, 89, 15,
		17, 4, 100, 71, 55, 75, 69, 87, 34, 92,
		43, 18, 88, 82, 30, 57, 23, 99, 59, 21,
		32, 22, 68, 56, 47, 40, 63, 62, 1, 31,
	}

	tree := new(avl.IntTree)
	for _, i := range ints {
		tree.Insert(i)
	}

	fmt.Println(tree.Search(42))
	fmt.Println(tree.Search(96))
	fmt.Println(tree.Search(1024))

}
Output:

true
true
false

func (*IntTree) Insert

func (t *IntTree) Insert(val int)

Insert a new Range into the AVL tree.

func (*IntTree) Search

func (t *IntTree) Search(val int) bool

Search returns true if the AVL tree contains the <val>.

type Range

type Range interface {
	// Compare returns an integer comparing two elements.
	// The result will be -1 if current element is less than the right,
	// and +1 if current element is greater that the right.
	// Otherwise, 0 will be return.
	Compare(right Range) int

	// Contains returns true if the right is a subset of current element.
	Contains(right Range) bool

	// Union returns the union of current element and the right.
	Union(right Range) Range
}

Range is the basic node for the AVL tree leaves. The concept Range can be a real data range in most cases, such as [LOWER_BOUND, UPPER_BOUND] . A Range can also be a single value, such as [VALUE_A, VALUE_A] .

type StringTree

type StringTree Tree

StringTree is a high-performance AVL tree for String.

Example
package main

import (
	"fmt"

	"github.com/sym01/algo/avl"
)

func main() {
	strs := []string{
		"eKSI9wZlde",
		"j1ORx3W0ph",
		"1Lw7uwm4VS",
		"WcOTlexQqG",
		"hqDGapsHq1",
		"mDy5mwwNzx",
		"VhY3HfqmG5",
		"Y5doxlrZe6",
		"VbR2pKkv9E",
		"OpUWxSI2eP",
		"Ja6CqjnFq5",
		"h6dlJ5m",
		"PBBKZnRBYu",
		"AgX3njkaZT",
		"ytXkDnD0vr",
		"8QJFS2fLGd",
		"PAarEfdt1w", // same string
		"PAarEfdt1w", // same string
		"PAarEfdt1w", // same string
		"8QJFS2fLGd",
	}

	tree := new(avl.StringTree)
	for _, s := range strs {
		tree.Insert(s)
	}

	for _, s := range strs {
		if !tree.Search(s) {
			fmt.Printf("%s not in tree\n", s)
		}
	}

	s := "abccc"
	if !tree.Search(s) {
		fmt.Printf("%s not in tree\n", s)
	}

}
Output:

abccc not in tree

func (*StringTree) Insert

func (t *StringTree) Insert(val string)

Insert a new Range into the AVL tree.

func (*StringTree) Search

func (t *StringTree) Search(val string) bool

Search returns true if the AVL tree contains the <val>.

type Tree

type Tree struct {
	// contains filtered or unexported fields
}

Tree is a high-performance AVL tree.

Example
package main

import (
	"fmt"

	"github.com/sym01/algo/avl"
)

// customized data struct for AVL tree
type intRange struct {
	min int
	max int
}

func (l *intRange) Compare(right avl.Range) int {
	r := right.(*intRange)
	if l.max < r.min {
		return -1
	}
	if l.min > r.max {
		return 1
	}
	return 0
}

func (l *intRange) Contains(right avl.Range) bool {
	r := right.(*intRange)
	if l.min > r.min {
		return false
	}
	if l.max < r.max {
		return false
	}

	return true
}

func (l *intRange) Union(right avl.Range) avl.Range {
	r := right.(*intRange)
	ret := &intRange{
		min: l.min,
		max: l.max,
	}
	if ret.min > r.min {
		ret.min = r.min
	}
	if ret.max < r.max {
		ret.max = r.max
	}
	return ret
}

func main() {
	data := []*intRange{
		{10, 15},
		{20, 25},
		{30, 35},
		{40, 45},
		{21, 26},
		{50, 55},
		{60, 65},
	}
	tree := new(avl.Tree)
	for _, item := range data {
		tree.Insert(item)
	}

	fmt.Println(tree.Search(&intRange{20, 26}))
	fmt.Println(tree.Search(&intRange{20, 27}))

}
Output:

true
false

func (*Tree) Insert

func (t *Tree) Insert(val Range)

Insert a new Range into the AVL tree.

func (*Tree) Search

func (t *Tree) Search(val Range) bool

Search returns true if the AVL tree contains the <val>.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL