adding gres

This commit is contained in:
John
2019-08-13 21:06:11 +08:00
parent 162df6b250
commit 9ae537cafc
13 changed files with 118 additions and 32 deletions

View File

@ -80,28 +80,28 @@ func (tree *AVLTree) Sets(data map[interface{}]interface{}) {
func (tree *AVLTree) Search(key interface{}) (value interface{}, found bool) {
tree.mu.RLock()
defer tree.mu.RUnlock()
if n := tree.doSearch(key); n != nil {
return n.Value, true
if node, found := tree.doSearch(key); found {
return node.Value, true
}
return nil, false
}
// doSearch searches the tree with given <key>.
// Second return parameter <found> is true if key was found, otherwise false.
func (tree *AVLTree) doSearch(key interface{}) *AVLTreeNode {
n := tree.root
for n != nil {
cmp := tree.comparator(key, n.Key)
func (tree *AVLTree) doSearch(key interface{}) (node *AVLTreeNode, found bool) {
node = tree.root
for node != nil {
cmp := tree.comparator(key, node.Key)
switch {
case cmp == 0:
return n
return node, true
case cmp < 0:
n = n.children[0]
node = node.children[0]
case cmp > 0:
n = n.children[1]
node = node.children[1]
}
}
return nil
return nil, false
}
// Get searches the node in the tree by <key> and returns its value or nil if key is not found in tree.
@ -122,8 +122,8 @@ func (tree *AVLTree) Get(key interface{}) (value interface{}) {
func (tree *AVLTree) doSetWithLockCheck(key interface{}, value interface{}) interface{} {
tree.mu.Lock()
defer tree.mu.Unlock()
if n := tree.doSearch(key); n != nil {
return n.Value
if node, found := tree.doSearch(key); found {
return node.Value
}
if f, ok := value.(func() interface{}); ok {
value = f()
@ -451,7 +451,8 @@ func (tree *AVLTree) IteratorAsc(f func(key, value interface{}) bool) {
func (tree *AVLTree) IteratorAscFrom(key interface{}, f func(key, value interface{}) bool) {
tree.mu.RLock()
defer tree.mu.RUnlock()
tree.doIteratorAsc(tree.doSearch(key), f)
node, _ := tree.doSearch(key)
tree.doIteratorAsc(node, f)
}
func (tree *AVLTree) doIteratorAsc(node *AVLTreeNode, f func(key, value interface{}) bool) {
@ -474,7 +475,8 @@ func (tree *AVLTree) IteratorDesc(f func(key, value interface{}) bool) {
func (tree *AVLTree) IteratorDescFrom(key interface{}, f func(key, value interface{}) bool) {
tree.mu.RLock()
defer tree.mu.RUnlock()
tree.doIteratorDesc(tree.doSearch(key), f)
node, _ := tree.doSearch(key)
tree.doIteratorDesc(node, f)
}
func (tree *AVLTree) doIteratorDesc(node *AVLTreeNode, f func(key, value interface{}) bool) {

View File

@ -142,7 +142,7 @@ func (tree *RedBlackTree) Get(key interface{}) (value interface{}) {
func (tree *RedBlackTree) doSetWithLockCheck(key interface{}, value interface{}) interface{} {
tree.mu.Lock()
defer tree.mu.Unlock()
if node := tree.doSearch(key); node != nil {
if node, found := tree.doSearch(key); found {
return node.Value
}
if f, ok := value.(func() interface{}); ok {
@ -253,8 +253,8 @@ func (tree *RedBlackTree) Contains(key interface{}) bool {
// doRemove removes the node from the tree by <key> without mutex.
func (tree *RedBlackTree) doRemove(key interface{}) (value interface{}) {
child := (*RedBlackTreeNode)(nil)
node := tree.doSearch(key)
if node == nil {
node, found := tree.doSearch(key)
if !found {
return
}
value = node.Value
@ -472,7 +472,8 @@ func (tree *RedBlackTree) IteratorAsc(f func(key, value interface{}) bool) {
func (tree *RedBlackTree) IteratorAscFrom(key interface{}, f func(key, value interface{}) bool) {
tree.mu.RLock()
defer tree.mu.RUnlock()
tree.doIteratorAsc(tree.doSearch(key), f)
node, _ := tree.doSearch(key)
tree.doIteratorAsc(node, f)
}
func (tree *RedBlackTree) doIteratorAsc(node *RedBlackTreeNode, f func(key, value interface{}) bool) {
@ -512,7 +513,8 @@ func (tree *RedBlackTree) IteratorDesc(f func(key, value interface{}) bool) {
func (tree *RedBlackTree) IteratorDescFrom(key interface{}, f func(key, value interface{}) bool) {
tree.mu.RLock()
defer tree.mu.RUnlock()
tree.doIteratorDesc(tree.doSearch(key), f)
node, _ := tree.doSearch(key)
tree.doIteratorDesc(node, f)
}
func (tree *RedBlackTree) doIteratorDesc(node *RedBlackTreeNode, f func(key, value interface{}) bool) {
@ -570,8 +572,8 @@ func (tree *RedBlackTree) Print() {
func (tree *RedBlackTree) Search(key interface{}) (value interface{}, found bool) {
tree.mu.RLock()
defer tree.mu.RUnlock()
node := tree.doSearch(key)
if node != nil {
node, found := tree.doSearch(key)
if found {
return node.Value, true
}
return nil, false
@ -629,20 +631,20 @@ func (tree *RedBlackTree) output(node *RedBlackTreeNode, prefix string, isTail b
// doSearch searches the tree with given <key> without mutex.
// It returns the node if found or otherwise nil.
func (tree *RedBlackTree) doSearch(key interface{}) *RedBlackTreeNode {
node := tree.root
func (tree *RedBlackTree) doSearch(key interface{}) (node *RedBlackTreeNode, found bool) {
node = tree.root
for node != nil {
compare := tree.comparator(key, node.Key)
switch {
case compare == 0:
return node
return node, true
case compare < 0:
node = node.left
case compare > 0:
node = node.right
}
}
return nil
return node, false
}
func (node *RedBlackTreeNode) grandparent() *RedBlackTreeNode {