diff --git a/g/container/gtree/gtree_avltree.go b/g/container/gtree/gtree_avltree.go index 7c67bc25f..23ba935f1 100644 --- a/g/container/gtree/gtree_avltree.go +++ b/g/container/gtree/gtree_avltree.go @@ -29,7 +29,7 @@ type AVLTreeNode struct { b int8 } -// NewAVLTree instantiates an AVL tree with the custom comparator. +// NewAVLTree instantiates an AVL tree with the custom key comparator. // The parameter used to specify whether using tree in un-concurrent-safety, // which is false in default. func NewAVLTree(comparator func(v1, v2 interface{}) int, unsafe...bool) *AVLTree { @@ -39,7 +39,7 @@ func NewAVLTree(comparator func(v1, v2 interface{}) int, unsafe...bool) *AVLTree } } -// NewAVLTreeFrom instantiates an AVL tree with the custom comparator and data map. +// NewAVLTreeFrom instantiates an AVL tree with the custom key comparator and data map. // The parameter used to specify whether using tree in un-concurrent-safety, // which is false in default. func NewAVLTreeFrom(comparator func(v1, v2 interface{}) int, data map[interface{}]interface{}, unsafe...bool) *AVLTree { @@ -222,7 +222,7 @@ func (tree *AVLTree) Contains(key interface{}) bool { return ok } -// Remove remove the node from the tree by key. +// Remove removes the node from the tree by key. // Key should adhere to the comparator's type assertion, otherwise method panics. func (tree *AVLTree) Remove(key interface{}) (value interface{}) { tree.mu.Lock() @@ -306,7 +306,7 @@ func (tree *AVLTree) Right() *AVLTreeNode { return node } -// Floor Finds floor node of the input key, return the floor node or nil if no ceiling is found. +// Floor Finds floor node of the input key, return the floor node or nil if no floor node is found. // Second return parameter is true if floor was found, otherwise false. // // Floor node is defined as the largest node that is smaller than or equal to the given node. @@ -317,16 +317,15 @@ func (tree *AVLTree) Right() *AVLTreeNode { func (tree *AVLTree) Floor(key interface{}) (floor *AVLTreeNode, found bool) { tree.mu.RLock() defer tree.mu.RUnlock() - found = false n := tree.root for n != nil { c := tree.comparator(key, n.Key) switch { - case c == 0: return n, true - case c < 0: n = n.children[0] - case c > 0: - floor, found = n, true - n = n.children[1] + case c == 0: return n, true + case c < 0: n = n.children[0] + case c > 0: + floor, found = n, true + n = n.children[1] } } if found { @@ -335,7 +334,7 @@ func (tree *AVLTree) Floor(key interface{}) (floor *AVLTreeNode, found bool) { return nil, false } -// Ceiling finds ceiling node of the input key, return the ceiling node or nil if no ceiling is found. +// Ceiling finds ceiling node of the input key, return the ceiling node or nil if no ceiling node is found. // Second return parameter is true if ceiling was found, otherwise false. // // Ceiling node is defined as the smallest node that is larger than or equal to the given node. @@ -343,10 +342,9 @@ func (tree *AVLTree) Floor(key interface{}) (floor *AVLTreeNode, found bool) { // all nodes in the tree is smaller than the given node. // // Key should adhere to the comparator's type assertion, otherwise method panics. -func (tree *AVLTree) Ceiling(key interface{}) (floor *AVLTreeNode, found bool) { +func (tree *AVLTree) Ceiling(key interface{}) (ceiling *AVLTreeNode, found bool) { tree.mu.RLock() defer tree.mu.RUnlock() - found = false n := tree.root for n != nil { c := tree.comparator(key, n.Key) @@ -354,7 +352,7 @@ func (tree *AVLTree) Ceiling(key interface{}) (floor *AVLTreeNode, found bool) { case c == 0: return n, true case c > 0: n = n.children[1] case c < 0: - floor, found = n, true + ceiling, found = n, true n = n.children[0] } } @@ -514,7 +512,7 @@ func (tree *AVLTree) remove(key interface{}, qp **AVLTreeNode) (value interface{ if fix { return value, removeFix(int8(-c), qp) } - return nil, false + return value, false } func removeMin(qp **AVLTreeNode, minKey *interface{}, minVal *interface{}) bool { diff --git a/g/container/gtree/gtree_redblacktree.go b/g/container/gtree/gtree_redblacktree.go index 064b1ac63..cc4cdd82a 100644 --- a/g/container/gtree/gtree_redblacktree.go +++ b/g/container/gtree/gtree_redblacktree.go @@ -36,7 +36,7 @@ type RedBlackTreeNode struct { parent *RedBlackTreeNode } -// NewRedBlackTree instantiates a red-black tree with the custom comparator. +// NewRedBlackTree instantiates a red-black tree with the custom key comparator. // The parameter used to specify whether using tree in un-concurrent-safety, // which is false in default. func NewRedBlackTree(comparator func(v1, v2 interface{}) int, unsafe...bool) *RedBlackTree { @@ -46,7 +46,7 @@ func NewRedBlackTree(comparator func(v1, v2 interface{}) int, unsafe...bool) *Re } } -// NewRedBlackTreeFrom instantiates a red-black tree with the custom comparator and map. +// NewRedBlackTreeFrom instantiates a red-black tree with the custom key comparator and map. // The parameter used to specify whether using tree in un-concurrent-safety, // which is false in default. func NewRedBlackTreeFrom(comparator func(v1, v2 interface{}) int, data map[interface{}]interface{}, unsafe...bool) *RedBlackTree { @@ -393,60 +393,56 @@ func (tree *RedBlackTree) rightNode() *RedBlackTreeNode { return p } -// Floor Finds floor node of the input , return the floor node or nil if no floor is found. +// Floor Finds floor node of the input key, return the floor node or nil if no floor node is found. +// Second return parameter is true if floor was found, otherwise false. // // Floor node is defined as the largest node that its key is smaller than or equal to the given . // A floor node may not be found, either because the tree is empty, or because // all nodes in the tree are larger than the given node. -func (tree *RedBlackTree) Floor(key interface{}) (floor *RedBlackTreeNode) { +func (tree *RedBlackTree) Floor(key interface{}) (floor *RedBlackTreeNode, found bool) { tree.mu.RLock() defer tree.mu.RUnlock() - found := false - node := tree.root - for node != nil { - compare := tree.comparator(key, node.Key) + n := tree.root + for n != nil { + compare := tree.comparator(key, n.Key) switch { - case compare == 0: - return node - case compare < 0: - node = node.left - case compare > 0: - floor, found = node, true - node = node.right + case compare == 0: return n, true + case compare < 0: n = n.left + case compare > 0: + floor, found = n, true + n = n.right } } if found { - return floor + return } - return nil + return nil, false } -// Ceiling finds ceiling node of the input , return the ceiling node or nil if no ceiling is found. +// Ceiling finds ceiling node of the input key, return the ceiling node or nil if no ceiling node is found. +// Second return parameter is true if ceiling was found, otherwise false. // // Ceiling node is defined as the smallest node that its key is larger than or equal to the given . // A ceiling node may not be found, either because the tree is empty, or because // all nodes in the tree are smaller than the given node. -func (tree *RedBlackTree) Ceiling(key interface{}) (ceiling *RedBlackTreeNode) { +func (tree *RedBlackTree) Ceiling(key interface{}) (ceiling *RedBlackTreeNode, found bool) { tree.mu.RLock() defer tree.mu.RUnlock() - found := false - node := tree.root - for node != nil { - compare := tree.comparator(key, node.Key) + n := tree.root + for n != nil { + compare := tree.comparator(key, n.Key) switch { - case compare == 0: - return node - case compare < 0: - ceiling, found = node, true - node = node.left - case compare > 0: - node = node.right + case compare == 0: return n, true + case compare > 0: n = n.right + case compare < 0: + ceiling, found = n, true + n = n.left } } if found { - return ceiling + return } - return nil + return nil, false } // Iterator is alias of IteratorAsc. diff --git a/geg/other/test.go b/geg/other/test.go index 125e7e362..57f880c51 100644 --- a/geg/other/test.go +++ b/geg/other/test.go @@ -1,24 +1,33 @@ package main import ( -<<<<<<< HEAD "fmt" + "github.com/gogf/gf/g/container/gtree" + "github.com/gogf/gf/g/util/gutil" ) func main() { - var i float64 = 0 - for index := 0; index < 10; index++ { - i += 0.1 - fmt.Println(i) - } -} -======= - "github.com/gogf/gf/g/encoding/gjson" -) + expect := map[interface{}]interface{}{ + 20: "val20", + 6: "val6", + 10: "val10", + 12: "val12", + 1: "val1", + 15: "val15", + 19: "val19", + 8: "val8", + 4: "val4"} + m := gtree.NewAVLTreeFrom(gutil.ComparatorInt, expect) + m.Print() -func main() { - j := gjson.New(`[1,2,3]`) - j.Remove("1") - j.Dump() + //m := avltree.NewWithIntComparator() + //m.Remove() + fmt.Println(1, m.Remove(1))// 应该输出val1,但输出nil + fmt.Println(2, m.Remove(1)) + fmt.Println(3, m.Get(1)) + + fmt.Println(4, m.Remove(20))// 应该输出val20,但输出nil + fmt.Println(5, m.Remove(20)) + fmt.Println(6, m.Get(20)) } ->>>>>>> master +