Merge branch 'feature/set-iterator' into develop
This commit is contained in:
commit
f1cf42b5a3
10
README.md
10
README.md
|
@ -39,13 +39,15 @@ func main() {
|
||||||
values3 := pq.GetAround(5) // values3 = [<nil>, 5, 4]
|
values3 := pq.GetAround(5) // values3 = [<nil>, 5, 4]
|
||||||
log.Println(values3)
|
log.Println(values3)
|
||||||
|
|
||||||
iter := pq.Iterator() // Next 小到大
|
iter := pq.Iterator() // Next 大到小 从root节点起始
|
||||||
// log.Println(iter.Value()) 直接使用会报错,
|
// log.Println(iter.Value()) 直接使用会报错,
|
||||||
iter.Next() // Next 从小到大
|
iter.ToHead()
|
||||||
log.Println(iter.Value()) // 起始最大值. true 5
|
log.Println(iter.Value()) // 起始最大值. true 5
|
||||||
|
log.Println(iter.Prev(), iter.Value()) // false 5
|
||||||
|
|
||||||
log.Println(iter.Next(), iter.Value()) // false 5
|
|
||||||
// Prev 大到小
|
// Prev 大到小
|
||||||
log.Println(iter.Prev(), iter.Value()) // true 4
|
log.Println(iter.Next(), iter.Value()) // true 4
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
|
@ -25,11 +25,11 @@ func (iter *Iterator) Next() bool {
|
||||||
return iter.cur != iter.ll.tail
|
return iter.cur != iter.ll.tail
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) MoveToHead() {
|
func (iter *Iterator) ToHead() {
|
||||||
iter.cur = iter.ll.head
|
iter.cur = iter.ll.head
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) MoveToTail() {
|
func (iter *Iterator) ToTail() {
|
||||||
iter.cur = iter.ll.tail
|
iter.cur = iter.ll.tail
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,11 +25,11 @@ func (iter *Iterator) Next() bool {
|
||||||
return iter.cur != iter.pl.tail
|
return iter.cur != iter.pl.tail
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) MoveToHead() {
|
func (iter *Iterator) ToHead() {
|
||||||
iter.cur = iter.pl.head
|
iter.cur = iter.pl.head
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) MoveToTail() {
|
func (iter *Iterator) ToTail() {
|
||||||
iter.cur = iter.pl.tail
|
iter.cur = iter.pl.tail
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,10 +78,10 @@ func (iter *CircularIterator) Next() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *CircularIterator) MoveToHead() {
|
func (iter *CircularIterator) ToHead() {
|
||||||
iter.cur = iter.pl.head
|
iter.cur = iter.pl.head
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *CircularIterator) MoveToTail() {
|
func (iter *CircularIterator) ToTail() {
|
||||||
iter.cur = iter.pl.tail
|
iter.cur = iter.pl.tail
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,7 +102,7 @@ func TestCircularIterator(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
iter.MoveToTail()
|
iter.ToTail()
|
||||||
for i := 0; i != 10; i++ {
|
for i := 0; i != 10; i++ {
|
||||||
iter.Prev()
|
iter.Prev()
|
||||||
if iter.Value() != i {
|
if iter.Value() != i {
|
||||||
|
|
|
@ -30,6 +30,16 @@ func NewIteratorWithCap(n *Node, cap int) *Iterator {
|
||||||
return iter
|
return iter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToHead() {
|
||||||
|
for iter.Prev() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToTail() {
|
||||||
|
for iter.Next() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (iter *Iterator) GetNode() *Node {
|
func (iter *Iterator) GetNode() *Node {
|
||||||
return iter.cur
|
return iter.cur
|
||||||
}
|
}
|
||||||
|
@ -44,25 +54,7 @@ func (iter *Iterator) Value() interface{} {
|
||||||
return iter.cur.value
|
return iter.cur.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Left() bool {
|
func (iter *Iterator) GetPrev(cur *Node, idx int) *Node {
|
||||||
if iter.cur.children[0] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[0]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) Right() bool {
|
|
||||||
if iter.cur.children[1] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[1]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
|
||||||
|
|
||||||
// iter := NewIterator(cur)
|
// iter := NewIterator(cur)
|
||||||
iter.SetNode(cur)
|
iter.SetNode(cur)
|
||||||
|
@ -93,7 +85,7 @@ func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
||||||
return cur
|
return cur
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Next() (result bool) {
|
func (iter *Iterator) Prev() (result bool) {
|
||||||
|
|
||||||
if iter.dir > -1 {
|
if iter.dir > -1 {
|
||||||
if iter.dir == 1 && iter.cur != nil {
|
if iter.dir == 1 && iter.cur != nil {
|
||||||
|
@ -121,7 +113,7 @@ func (iter *Iterator) Next() (result bool) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) GetPrev(cur *Node, idx int) *Node {
|
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
||||||
|
|
||||||
// iter := NewIterator(cur)
|
// iter := NewIterator(cur)
|
||||||
iter.SetNode(cur)
|
iter.SetNode(cur)
|
||||||
|
@ -152,7 +144,7 @@ func (iter *Iterator) GetPrev(cur *Node, idx int) *Node {
|
||||||
return cur
|
return cur
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Prev() (result bool) {
|
func (iter *Iterator) Next() (result bool) {
|
||||||
|
|
||||||
if iter.dir < 1 { // 非 1(next 方向定义 -1 为 prev)
|
if iter.dir < 1 { // 非 1(next 方向定义 -1 为 prev)
|
||||||
if iter.dir == -1 && iter.cur != nil { // 如果上次为prev方向, 则清空辅助计算的栈
|
if iter.dir == -1 && iter.cur != nil { // 如果上次为prev方向, 则清空辅助计算的栈
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package pqueue
|
package pqueue
|
||||||
|
|
||||||
import "github.com/474420502/focus/compare"
|
import (
|
||||||
|
"github.com/474420502/focus/compare"
|
||||||
|
"github.com/davecgh/go-spew/spew"
|
||||||
|
)
|
||||||
|
|
||||||
type PriorityQueue struct {
|
type PriorityQueue struct {
|
||||||
queue *vbTree
|
queue *vbTree
|
||||||
|
@ -78,3 +81,7 @@ func (pq *PriorityQueue) Remove(key interface{}) (interface{}, bool) {
|
||||||
func (pq *PriorityQueue) Values() []interface{} {
|
func (pq *PriorityQueue) Values() []interface{} {
|
||||||
return pq.queue.Values()
|
return pq.queue.Values()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (pq *PriorityQueue) String() string {
|
||||||
|
return spew.Sprint(pq.queue.Values())
|
||||||
|
}
|
||||||
|
|
|
@ -242,6 +242,90 @@ func TestQueueIndex(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPriorityQueue_Iterator(t *testing.T) {
|
||||||
|
pq := New(compare.Int)
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
pq.Push(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
pq.Push(-1)
|
||||||
|
pq.Push(10)
|
||||||
|
|
||||||
|
result := pq.String()
|
||||||
|
if result != "[10 4 3 2 1 0 -1]" {
|
||||||
|
t.Error("should be [10 4 3 2 1 0 -1]")
|
||||||
|
}
|
||||||
|
|
||||||
|
iter := pq.Iterator()
|
||||||
|
iter.ToHead()
|
||||||
|
|
||||||
|
values := pq.Values()
|
||||||
|
for i := 0; ; i++ {
|
||||||
|
if values[i] != iter.Value() {
|
||||||
|
t.Error(values[i], " != ", iter.Value())
|
||||||
|
}
|
||||||
|
|
||||||
|
if !iter.Prev() {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPriorityQueue_Iterator2(t *testing.T) {
|
||||||
|
pq := New(compare.Int)
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
pq.Push(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
iter := pq.Iterator()
|
||||||
|
iter.ToHead()
|
||||||
|
|
||||||
|
n, _ := pq.IndexNode(0)
|
||||||
|
if n.value != 4 {
|
||||||
|
t.Error(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, _ := pq.Top(); v != 4 {
|
||||||
|
t.Error("Top != 4, and is ", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
if v := iter.GetNext(n, 2).value; v != 2 {
|
||||||
|
t.Error("iter.GetNext(n, 2) != 2, and is ", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
pq = New(compare.Int)
|
||||||
|
for i := 100; i >= 0; i-- {
|
||||||
|
pq.Push(i)
|
||||||
|
}
|
||||||
|
if v, _ := pq.Top(); v != 100 {
|
||||||
|
t.Error("Top != 100, and is ", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
for pq.Size() >= 50 {
|
||||||
|
pq.Pop()
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, _ := pq.Top(); v != 48 {
|
||||||
|
t.Error("Top != 48, and is ", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
pq = New(compare.Int)
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
pq.Push(i)
|
||||||
|
}
|
||||||
|
if v, _ := pq.Top(); v != 99 {
|
||||||
|
t.Error("Top != 99, and is ", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
for pq.Size() >= 50 {
|
||||||
|
pq.Pop()
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, _ := pq.Top(); v != 48 {
|
||||||
|
t.Error("Top != 49, and is ", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// func BenchmarkQueueGet(b *testing.B) {
|
// func BenchmarkQueueGet(b *testing.B) {
|
||||||
|
|
||||||
// l := loadTestData()
|
// l := loadTestData()
|
||||||
|
|
|
@ -118,7 +118,7 @@ func (tree *vbTree) IndexRange(idx1, idx2 int) (result []interface{}, ok bool) {
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
result = make([]interface{}, 0, idx1-idx2)
|
result = make([]interface{}, 0, idx1-idx2)
|
||||||
for i := idx2; i <= idx1; i++ {
|
for i := idx2; i <= idx1; i++ {
|
||||||
if iter.Next() {
|
if iter.Prev() {
|
||||||
result = append(result, iter.Value())
|
result = append(result, iter.Value())
|
||||||
} else {
|
} else {
|
||||||
ok = false
|
ok = false
|
||||||
|
@ -140,7 +140,7 @@ func (tree *vbTree) IndexRange(idx1, idx2 int) (result []interface{}, ok bool) {
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
result = make([]interface{}, 0, idx2-idx1)
|
result = make([]interface{}, 0, idx2-idx1)
|
||||||
for i := idx1; i <= idx2; i++ {
|
for i := idx1; i <= idx2; i++ {
|
||||||
if iter.Prev() {
|
if iter.Next() {
|
||||||
result = append(result, iter.Value())
|
result = append(result, iter.Value())
|
||||||
} else {
|
} else {
|
||||||
ok = false
|
ok = false
|
||||||
|
@ -174,7 +174,7 @@ func (tree *vbTree) removeNode(n *Node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if tree.top == n {
|
if tree.top == n {
|
||||||
tree.top = tree.iter.GetPrev(n, 1)
|
tree.top = tree.iter.GetNext(n, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
ls, rs := getChildrenSize(n)
|
ls, rs := getChildrenSize(n)
|
||||||
|
@ -278,7 +278,7 @@ func (tree *vbTree) GetRange(k1, k2 interface{}) (result []interface{}) {
|
||||||
// iter := NewIterator(min)
|
// iter := NewIterator(min)
|
||||||
tree.iter.SetNode(min)
|
tree.iter.SetNode(min)
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
for iter.Next() {
|
for iter.Prev() {
|
||||||
result = append(result, iter.Value())
|
result = append(result, iter.Value())
|
||||||
if iter.cur == max {
|
if iter.cur == max {
|
||||||
break
|
break
|
||||||
|
@ -305,7 +305,7 @@ func (tree *vbTree) GetRange(k1, k2 interface{}) (result []interface{}) {
|
||||||
// iter := NewIterator(max)
|
// iter := NewIterator(max)
|
||||||
tree.iter.SetNode(max)
|
tree.iter.SetNode(max)
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
for iter.Prev() {
|
for iter.Next() {
|
||||||
result = append(result, iter.Value())
|
result = append(result, iter.Value())
|
||||||
if iter.cur == min {
|
if iter.cur == min {
|
||||||
break
|
break
|
||||||
|
@ -358,8 +358,8 @@ func (tree *vbTree) getArounNode(key interface{}) (result [3]*Node) {
|
||||||
|
|
||||||
tree.iter.SetNode(n)
|
tree.iter.SetNode(n)
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
iter.Prev()
|
iter.Next()
|
||||||
for iter.Prev() {
|
for iter.Next() {
|
||||||
if tree.Compare(iter.cur.value, n.value) == 0 {
|
if tree.Compare(iter.cur.value, n.value) == 0 {
|
||||||
n = iter.cur
|
n = iter.cur
|
||||||
} else {
|
} else {
|
||||||
|
@ -378,21 +378,21 @@ func (tree *vbTree) getArounNode(key interface{}) (result [3]*Node) {
|
||||||
|
|
||||||
if result[1] != nil {
|
if result[1] != nil {
|
||||||
|
|
||||||
result[0] = tree.iter.GetPrev(result[1], 1)
|
result[0] = tree.iter.GetNext(result[1], 1)
|
||||||
result[2] = tree.iter.GetNext(result[1], 1)
|
result[2] = tree.iter.GetPrev(result[1], 1)
|
||||||
} else {
|
} else {
|
||||||
result[0] = last
|
result[0] = last
|
||||||
result[2] = tree.iter.GetNext(last, 1)
|
result[2] = tree.iter.GetPrev(last, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
case -1:
|
case -1:
|
||||||
|
|
||||||
if result[1] != nil {
|
if result[1] != nil {
|
||||||
result[0] = tree.iter.GetPrev(result[1], 1)
|
result[0] = tree.iter.GetNext(result[1], 1)
|
||||||
result[2] = tree.iter.GetNext(result[1], 1)
|
result[2] = tree.iter.GetPrev(result[1], 1)
|
||||||
} else {
|
} else {
|
||||||
result[2] = last
|
result[2] = last
|
||||||
result[0] = tree.iter.GetPrev(last, 1)
|
result[0] = tree.iter.GetNext(last, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -400,8 +400,8 @@ func (tree *vbTree) getArounNode(key interface{}) (result [3]*Node) {
|
||||||
if result[1] == nil {
|
if result[1] == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
result[0] = tree.iter.GetPrev(result[1], 1)
|
result[0] = tree.iter.GetNext(result[1], 1)
|
||||||
result[2] = tree.iter.GetNext(result[1], 1)
|
result[2] = tree.iter.GetPrev(result[1], 1)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -418,8 +418,8 @@ func (tree *vbTree) GetNode(value interface{}) (*Node, bool) {
|
||||||
|
|
||||||
tree.iter.SetNode(n)
|
tree.iter.SetNode(n)
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
iter.Prev()
|
iter.Next()
|
||||||
for iter.Prev() {
|
for iter.Next() {
|
||||||
if tree.Compare(iter.cur.value, n.value) == 0 {
|
if tree.Compare(iter.cur.value, n.value) == 0 {
|
||||||
n = iter.cur
|
n = iter.cur
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -30,6 +30,16 @@ func NewIteratorWithCap(n *Node, cap int) *Iterator {
|
||||||
return iter
|
return iter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToHead() {
|
||||||
|
for iter.Prev() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToTail() {
|
||||||
|
for iter.Next() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (iter *Iterator) GetNode() *Node {
|
func (iter *Iterator) GetNode() *Node {
|
||||||
return iter.cur
|
return iter.cur
|
||||||
}
|
}
|
||||||
|
@ -44,25 +54,7 @@ func (iter *Iterator) Value() interface{} {
|
||||||
return iter.cur.value
|
return iter.cur.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Left() bool {
|
func (iter *Iterator) GetPrev(cur *Node, idx int) *Node {
|
||||||
if iter.cur.children[0] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[0]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) Right() bool {
|
|
||||||
if iter.cur.children[1] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[1]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
|
||||||
|
|
||||||
// iter := NewIterator(cur)
|
// iter := NewIterator(cur)
|
||||||
iter.SetNode(cur)
|
iter.SetNode(cur)
|
||||||
|
@ -93,7 +85,7 @@ func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
||||||
return cur
|
return cur
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Next() (result bool) {
|
func (iter *Iterator) Prev() (result bool) {
|
||||||
|
|
||||||
if iter.dir > -1 {
|
if iter.dir > -1 {
|
||||||
if iter.dir == 1 && iter.cur != nil {
|
if iter.dir == 1 && iter.cur != nil {
|
||||||
|
@ -121,7 +113,7 @@ func (iter *Iterator) Next() (result bool) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) GetPrev(cur *Node, idx int) *Node {
|
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
||||||
|
|
||||||
// iter := NewIterator(cur)
|
// iter := NewIterator(cur)
|
||||||
iter.SetNode(cur)
|
iter.SetNode(cur)
|
||||||
|
@ -152,7 +144,7 @@ func (iter *Iterator) GetPrev(cur *Node, idx int) *Node {
|
||||||
return cur
|
return cur
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Prev() (result bool) {
|
func (iter *Iterator) Next() (result bool) {
|
||||||
|
|
||||||
if iter.dir < 1 { // 非 1(next 方向定义 -1 为 prev)
|
if iter.dir < 1 { // 非 1(next 方向定义 -1 为 prev)
|
||||||
if iter.dir == -1 && iter.cur != nil { // 如果上次为prev方向, 则清空辅助计算的栈
|
if iter.dir == -1 && iter.cur != nil { // 如果上次为prev方向, 则清空辅助计算的栈
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package pqueuekey
|
package pqueuekey
|
||||||
|
|
||||||
import "github.com/474420502/focus/compare"
|
import (
|
||||||
|
"github.com/474420502/focus/compare"
|
||||||
|
"github.com/davecgh/go-spew/spew"
|
||||||
|
)
|
||||||
|
|
||||||
type PriorityQueue struct {
|
type PriorityQueue struct {
|
||||||
queue *vbTree
|
queue *vbTree
|
||||||
|
@ -78,3 +81,7 @@ func (pq *PriorityQueue) Remove(key interface{}) (interface{}, bool) {
|
||||||
func (pq *PriorityQueue) Values() []interface{} {
|
func (pq *PriorityQueue) Values() []interface{} {
|
||||||
return pq.queue.Values()
|
return pq.queue.Values()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (pq *PriorityQueue) String() string {
|
||||||
|
return spew.Sprint(pq.queue.Values())
|
||||||
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package pqueuekey
|
package pqueuekey
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
|
|
||||||
"github.com/474420502/focus/compare"
|
"github.com/474420502/focus/compare"
|
||||||
|
"github.com/davecgh/go-spew/spew"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestQueuePush(t *testing.T) {
|
func TestQueuePush(t *testing.T) {
|
||||||
|
@ -345,3 +345,124 @@ func TestQueueIndex(t *testing.T) {
|
||||||
// pq.Pop()
|
// pq.Pop()
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
func TestPriorityQueue_Iterator(t *testing.T) {
|
||||||
|
pq := New(compare.Int)
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
pq.Push(i, i)
|
||||||
|
}
|
||||||
|
|
||||||
|
pq.Push(-1, -1)
|
||||||
|
pq.Push(10, 10)
|
||||||
|
|
||||||
|
result := pq.String()
|
||||||
|
if result != "[10 4 3 2 1 0 -1]" {
|
||||||
|
t.Error("should be [10 4 3 2 1 0 -1]")
|
||||||
|
}
|
||||||
|
|
||||||
|
iter := pq.Iterator()
|
||||||
|
iter.ToHead()
|
||||||
|
|
||||||
|
values := pq.Values()
|
||||||
|
for i := 0; ; i++ {
|
||||||
|
if values[i] != iter.Value() {
|
||||||
|
t.Error(values[i], " != ", iter.Value())
|
||||||
|
}
|
||||||
|
|
||||||
|
if !iter.Next() {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPriorityQueue_Iterator2(t *testing.T) {
|
||||||
|
pq := New(compare.Int)
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
pq.Push(i, i)
|
||||||
|
}
|
||||||
|
|
||||||
|
iter := pq.Iterator()
|
||||||
|
iter.ToHead()
|
||||||
|
|
||||||
|
n, _ := pq.IndexNode(0)
|
||||||
|
if n.value != 4 {
|
||||||
|
t.Error(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, _ := pq.Top(); v != 4 {
|
||||||
|
t.Error("Top != 4, and is ", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
if v := iter.GetNext(n, 2).value; v != 2 {
|
||||||
|
t.Error("iter.GetNext(n, 2) != 2, and is ", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
pq = New(compare.Int)
|
||||||
|
for i := 100; i >= 0; i-- {
|
||||||
|
pq.Push(i, i)
|
||||||
|
}
|
||||||
|
if v, _ := pq.Top(); v != 100 {
|
||||||
|
t.Error("Top != 100, and is ", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
for pq.Size() >= 50 {
|
||||||
|
pq.Pop()
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, _ := pq.Top(); v != 48 {
|
||||||
|
t.Error("Top != 48, and is ", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
pq = New(compare.Int)
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
pq.Push(i, i)
|
||||||
|
}
|
||||||
|
if v, _ := pq.Top(); v != 99 {
|
||||||
|
t.Error("Top != 99, and is ", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
for pq.Size() >= 50 {
|
||||||
|
pq.Pop()
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, _ := pq.Top(); v != 48 {
|
||||||
|
t.Error("Top != 49, and is ", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMain(t *testing.T) {
|
||||||
|
pq := New(compare.Int)
|
||||||
|
pq.Push(1, 1)
|
||||||
|
pq.Push(4, 4)
|
||||||
|
pq.Push(5, 5)
|
||||||
|
pq.Push(6, 6)
|
||||||
|
pq.Push(2, 2) // pq.Values() = [6 5 4 2 1]
|
||||||
|
log.Println(pq.Values())
|
||||||
|
value, _ := pq.Pop() // value = 6
|
||||||
|
log.Println(value)
|
||||||
|
value, _ = pq.Get(1) // value = 1 pq.Values() = [5 4 2 1]
|
||||||
|
log.Println(value)
|
||||||
|
value, _ = pq.Get(0) // value = nil , Get equal to Seach Key
|
||||||
|
log.Println(value)
|
||||||
|
value, _ = pq.Index(0) // value = 5, compare.Int the order from big to small
|
||||||
|
log.Println(value)
|
||||||
|
values := pq.GetRange(2, 5) // values = [2 4 5]
|
||||||
|
log.Println(values)
|
||||||
|
values = pq.GetRange(5, 2) // values = [5 4 2]
|
||||||
|
log.Println(values)
|
||||||
|
values = pq.GetRange(100, 2) // values = [5 4 2]
|
||||||
|
log.Println(values)
|
||||||
|
values3 := pq.GetAround(5) // values3 = [<nil>, 5, 4]
|
||||||
|
log.Println(values3)
|
||||||
|
|
||||||
|
iter := pq.Iterator() // Next 大到小 从root节点起始
|
||||||
|
log.Println(pq.String())
|
||||||
|
// log.Println(iter.Value()) 直接使用会报错,
|
||||||
|
iter.ToHead()
|
||||||
|
log.Println(iter.Value()) // 起始最大值. true 5
|
||||||
|
log.Println(iter.Prev(), iter.Value()) // false 5
|
||||||
|
|
||||||
|
// Prev 大到小
|
||||||
|
log.Println(iter.Next(), iter.Value()) // true 4
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ func (n *Node) String() string {
|
||||||
return spew.Sprint(n.value) + "(" + p + "|" + spew.Sprint(n.size) + ")"
|
return spew.Sprint(n.value) + "(" + p + "|" + spew.Sprint(n.size) + ")"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 已经修改过GetNext GetPrev逻辑与avl相反
|
||||||
type vbTree struct {
|
type vbTree struct {
|
||||||
root *Node
|
root *Node
|
||||||
Compare compare.Compare
|
Compare compare.Compare
|
||||||
|
@ -118,7 +119,7 @@ func (tree *vbTree) IndexRange(idx1, idx2 int) (result []interface{}, ok bool) {
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
result = make([]interface{}, 0, idx1-idx2)
|
result = make([]interface{}, 0, idx1-idx2)
|
||||||
for i := idx2; i <= idx1; i++ {
|
for i := idx2; i <= idx1; i++ {
|
||||||
if iter.Next() {
|
if iter.Prev() {
|
||||||
result = append(result, iter.Value())
|
result = append(result, iter.Value())
|
||||||
} else {
|
} else {
|
||||||
ok = false
|
ok = false
|
||||||
|
@ -140,7 +141,7 @@ func (tree *vbTree) IndexRange(idx1, idx2 int) (result []interface{}, ok bool) {
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
result = make([]interface{}, 0, idx2-idx1)
|
result = make([]interface{}, 0, idx2-idx1)
|
||||||
for i := idx1; i <= idx2; i++ {
|
for i := idx1; i <= idx2; i++ {
|
||||||
if iter.Prev() {
|
if iter.Next() {
|
||||||
result = append(result, iter.Value())
|
result = append(result, iter.Value())
|
||||||
} else {
|
} else {
|
||||||
ok = false
|
ok = false
|
||||||
|
@ -174,7 +175,7 @@ func (tree *vbTree) removeNode(n *Node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if tree.top == n {
|
if tree.top == n {
|
||||||
tree.top = tree.iter.GetPrev(n, 1)
|
tree.top = tree.iter.GetNext(n, 1) // 最大值 Next一位后为下个最大值
|
||||||
}
|
}
|
||||||
|
|
||||||
ls, rs := getChildrenSize(n)
|
ls, rs := getChildrenSize(n)
|
||||||
|
@ -278,7 +279,7 @@ func (tree *vbTree) GetRange(k1, k2 interface{}) (result []interface{}) {
|
||||||
// iter := NewIterator(min)
|
// iter := NewIterator(min)
|
||||||
tree.iter.SetNode(min)
|
tree.iter.SetNode(min)
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
for iter.Next() {
|
for iter.Prev() {
|
||||||
result = append(result, iter.Value())
|
result = append(result, iter.Value())
|
||||||
if iter.cur == max {
|
if iter.cur == max {
|
||||||
break
|
break
|
||||||
|
@ -305,7 +306,7 @@ func (tree *vbTree) GetRange(k1, k2 interface{}) (result []interface{}) {
|
||||||
// iter := NewIterator(max)
|
// iter := NewIterator(max)
|
||||||
tree.iter.SetNode(max)
|
tree.iter.SetNode(max)
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
for iter.Prev() {
|
for iter.Next() {
|
||||||
result = append(result, iter.Value())
|
result = append(result, iter.Value())
|
||||||
if iter.cur == min {
|
if iter.cur == min {
|
||||||
break
|
break
|
||||||
|
@ -357,8 +358,8 @@ func (tree *vbTree) getArounNode(key interface{}) (result [3]*Node) {
|
||||||
|
|
||||||
tree.iter.SetNode(n)
|
tree.iter.SetNode(n)
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
iter.Prev()
|
iter.Next()
|
||||||
for iter.Prev() {
|
for iter.Next() {
|
||||||
if tree.Compare(iter.cur.key, n.key) == 0 {
|
if tree.Compare(iter.cur.key, n.key) == 0 {
|
||||||
n = iter.cur
|
n = iter.cur
|
||||||
} else {
|
} else {
|
||||||
|
@ -377,21 +378,21 @@ func (tree *vbTree) getArounNode(key interface{}) (result [3]*Node) {
|
||||||
|
|
||||||
if result[1] != nil {
|
if result[1] != nil {
|
||||||
|
|
||||||
result[0] = tree.iter.GetPrev(result[1], 1)
|
result[0] = tree.iter.GetNext(result[1], 1)
|
||||||
result[2] = tree.iter.GetNext(result[1], 1)
|
result[2] = tree.iter.GetPrev(result[1], 1)
|
||||||
} else {
|
} else {
|
||||||
result[0] = last
|
result[0] = last
|
||||||
result[2] = tree.iter.GetNext(last, 1)
|
result[2] = tree.iter.GetPrev(last, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
case -1:
|
case -1:
|
||||||
|
|
||||||
if result[1] != nil {
|
if result[1] != nil {
|
||||||
result[0] = tree.iter.GetPrev(result[1], 1)
|
result[0] = tree.iter.GetNext(result[1], 1)
|
||||||
result[2] = tree.iter.GetNext(result[1], 1)
|
result[2] = tree.iter.GetPrev(result[1], 1)
|
||||||
} else {
|
} else {
|
||||||
result[2] = last
|
result[2] = last
|
||||||
result[0] = tree.iter.GetPrev(last, 1)
|
result[0] = tree.iter.GetNext(last, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -399,8 +400,8 @@ func (tree *vbTree) getArounNode(key interface{}) (result [3]*Node) {
|
||||||
if result[1] == nil {
|
if result[1] == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
result[0] = tree.iter.GetPrev(result[1], 1)
|
result[0] = tree.iter.GetNext(result[1], 1)
|
||||||
result[2] = tree.iter.GetNext(result[1], 1)
|
result[2] = tree.iter.GetPrev(result[1], 1)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -417,8 +418,8 @@ func (tree *vbTree) GetNode(key interface{}) (*Node, bool) {
|
||||||
|
|
||||||
tree.iter.SetNode(n)
|
tree.iter.SetNode(n)
|
||||||
iter := tree.iter
|
iter := tree.iter
|
||||||
iter.Prev()
|
iter.Next()
|
||||||
for iter.Prev() {
|
for iter.Next() {
|
||||||
if tree.Compare(iter.cur.key, n.key) == 0 {
|
if tree.Compare(iter.cur.key, n.key) == 0 {
|
||||||
n = iter.cur
|
n = iter.cur
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/474420502/focus/tree/avldup"
|
|
||||||
"github.com/474420502/focus/compare"
|
"github.com/474420502/focus/compare"
|
||||||
|
"github.com/474420502/focus/tree/avldup"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TreeSet
|
// TreeSet
|
||||||
|
@ -70,9 +70,15 @@ func (set *TreeSet) Size() int {
|
||||||
return set.tree.Size()
|
return set.tree.Size()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Iterator avl Iterator
|
||||||
|
func (set *TreeSet) Iterator() *avldup.Iterator {
|
||||||
|
return set.tree.Iterator()
|
||||||
|
}
|
||||||
|
|
||||||
// String
|
// String
|
||||||
func (set *TreeSet) String() string {
|
func (set *TreeSet) String() string {
|
||||||
content := "HashSet\n"
|
// content := "HashSet\n"
|
||||||
|
var content = ""
|
||||||
items := []string{}
|
items := []string{}
|
||||||
|
|
||||||
set.tree.Traversal(func(k interface{}) bool {
|
set.tree.Traversal(func(k interface{}) bool {
|
||||||
|
@ -80,6 +86,6 @@ func (set *TreeSet) String() string {
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
|
|
||||||
content += strings.Join(items, ", ")
|
content += "(" + strings.Join(items, ", ") + ")"
|
||||||
return content
|
return content
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1,179 @@
|
||||||
package treeset
|
package treeset
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/davecgh/go-spew/spew"
|
||||||
|
|
||||||
|
"github.com/474420502/focus/compare"
|
||||||
|
"github.com/474420502/focus/tree/avldup"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestTreeSet_Add(t *testing.T) {
|
||||||
|
type fields struct {
|
||||||
|
tree *avldup.Tree
|
||||||
|
}
|
||||||
|
type args struct {
|
||||||
|
items []interface{}
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
result string
|
||||||
|
fields fields
|
||||||
|
args args
|
||||||
|
}{
|
||||||
|
{name: "add int", result: "(1, 3, 5)", args: args{items: []interface{}{1, 5, 3, 3, 5}}},
|
||||||
|
{name: "add -int", result: "(-5, 1, 5, 3132)", args: args{items: []interface{}{-5, -5, 3132, 3132, 5, 1, 1, 1}}},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
set := New(compare.Int)
|
||||||
|
set.Add(tt.args.items...)
|
||||||
|
if set.String() != tt.result {
|
||||||
|
t.Error(set.String(), " != ", tt.result)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
tests2 := []struct {
|
||||||
|
name string
|
||||||
|
result string
|
||||||
|
fields fields
|
||||||
|
args args
|
||||||
|
}{
|
||||||
|
{name: "add String 1", result: "(1, 3, 5)", args: args{items: []interface{}{"1", "5", "3", "3", "5"}}},
|
||||||
|
{name: "add String 2", result: "(-5, 1, 3132, 5)", args: args{items: []interface{}{"-5", "-5", "3132", "3132", "5", "1", "1", "1"}}},
|
||||||
|
{name: "add String 3", result: "(a, aa, b, bc)", args: args{items: []interface{}{"a", "b", "aa", "aa", "bc"}}},
|
||||||
|
{name: "add String 4", result: "(他, 你, 我, 我我)", args: args{items: []interface{}{"我", "你", "他", "我", "我我"}}},
|
||||||
|
}
|
||||||
|
for _, tt := range tests2 {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
set := New(compare.String)
|
||||||
|
set.Add(tt.args.items...)
|
||||||
|
if set.String() != tt.result {
|
||||||
|
t.Error(set.String(), " != ", tt.result)
|
||||||
|
}
|
||||||
|
|
||||||
|
vstr := spew.Sprint(set.Values())
|
||||||
|
|
||||||
|
if vstr[1:len(vstr)-1] != strings.ReplaceAll(tt.result[1:len(tt.result)-1], ",", "") {
|
||||||
|
t.Error(vstr[1:len(vstr)-1], tt.result[1:len(tt.result)-1])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTreeSet_Remove(t *testing.T) {
|
||||||
|
type fields struct {
|
||||||
|
tree *avldup.Tree
|
||||||
|
}
|
||||||
|
type args struct {
|
||||||
|
addItems []interface{}
|
||||||
|
removeItems []interface{}
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
result string
|
||||||
|
fields fields
|
||||||
|
args args
|
||||||
|
}{
|
||||||
|
// TODO: Add test cases.
|
||||||
|
{name: "remove 1", result: "()",
|
||||||
|
args: args{
|
||||||
|
addItems: []interface{}{5, 7, 5, 3, 2},
|
||||||
|
removeItems: []interface{}{5, 7, 3, 2}},
|
||||||
|
},
|
||||||
|
|
||||||
|
{name: "remove 2", result: "(5)",
|
||||||
|
args: args{
|
||||||
|
addItems: []interface{}{5, 7, 5, 3, 2},
|
||||||
|
removeItems: []interface{}{7, 3, 2}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
set := New(compare.Int)
|
||||||
|
set.Add(tt.args.addItems...)
|
||||||
|
set.Remove(tt.args.removeItems...)
|
||||||
|
|
||||||
|
if set.String() != tt.result {
|
||||||
|
t.Error(set.String(), " != ", tt.result)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTreeSet_Base(t *testing.T) {
|
||||||
|
set := New(compare.Int)
|
||||||
|
set.Add(5, 4, 3, 5)
|
||||||
|
|
||||||
|
if !set.Contains(5) {
|
||||||
|
t.Error("Contains 5 is true")
|
||||||
|
}
|
||||||
|
|
||||||
|
set.Clear()
|
||||||
|
|
||||||
|
if set.Contains(5) {
|
||||||
|
t.Error("Contains 5 is false")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !set.Empty() {
|
||||||
|
t.Error("should be Empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
set.Add(1, 1, 1, 2, 2, 3, 7, 9, 10)
|
||||||
|
|
||||||
|
var results []interface{}
|
||||||
|
results = set.GetRange(4, 10)
|
||||||
|
if spew.Sprint(results) != "[7 9 10]" {
|
||||||
|
t.Error(results)
|
||||||
|
}
|
||||||
|
|
||||||
|
results = set.GetRange(1, 10)
|
||||||
|
if spew.Sprint(results) != "[1 2 3 7 9 10]" {
|
||||||
|
t.Error(results)
|
||||||
|
}
|
||||||
|
|
||||||
|
results3 := set.GetAround(3)
|
||||||
|
if spew.Sprint(results3) != "[2 3 7]" {
|
||||||
|
t.Error(results3)
|
||||||
|
}
|
||||||
|
|
||||||
|
results3 = set.GetAround(1)
|
||||||
|
if spew.Sprint(results3) != "[<nil> 1 2]" {
|
||||||
|
t.Error(results3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTreeSet_Iterator(t *testing.T) {
|
||||||
|
set := New(compare.Int)
|
||||||
|
set.Add(5, 4, 3, 5)
|
||||||
|
|
||||||
|
iter := set.Iterator()
|
||||||
|
iter.ToHead()
|
||||||
|
// 3 4 5
|
||||||
|
if iter.Value() != 3 {
|
||||||
|
t.Error(iter.Value())
|
||||||
|
}
|
||||||
|
|
||||||
|
iter.Next()
|
||||||
|
if iter.Value() != 4 {
|
||||||
|
t.Error(iter.Value())
|
||||||
|
}
|
||||||
|
|
||||||
|
iter.Next()
|
||||||
|
if iter.Value() != 5 {
|
||||||
|
t.Error(iter.Value())
|
||||||
|
}
|
||||||
|
|
||||||
|
iter.ToTail()
|
||||||
|
if iter.Value() != 5 {
|
||||||
|
t.Error(iter.Value())
|
||||||
|
}
|
||||||
|
|
||||||
|
iter.Prev()
|
||||||
|
if iter.Value() != 4 {
|
||||||
|
t.Error(iter.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -22,6 +22,43 @@ func loadTestData() []int {
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIteratorHeadTail(t *testing.T) {
|
||||||
|
tree := New(compare.Int)
|
||||||
|
for _, v := range []int{1, 2, 7, 4, 5, 6, 7, 14, 15, 20, 30, 21, 3} {
|
||||||
|
tree.Put(v)
|
||||||
|
}
|
||||||
|
// ` AVLTree
|
||||||
|
// │ ┌── 30
|
||||||
|
// │ │ └── 21
|
||||||
|
// │ ┌── 20
|
||||||
|
// │ │ └── 15
|
||||||
|
// └── 14
|
||||||
|
// │ ┌── 7
|
||||||
|
// │ ┌── 7
|
||||||
|
// │ │ └── 6
|
||||||
|
// └── 5
|
||||||
|
// │ ┌── 4
|
||||||
|
// │ │ └── 3
|
||||||
|
// └── 2
|
||||||
|
// └── 1`
|
||||||
|
|
||||||
|
iter := tree.Iterator()
|
||||||
|
iter.Prev()
|
||||||
|
if iter.Value() != 14 {
|
||||||
|
t.Error("iter.Value() != ", 14, " value =", iter.Value())
|
||||||
|
}
|
||||||
|
|
||||||
|
iter.ToHead()
|
||||||
|
if iter.Value() != 1 {
|
||||||
|
t.Error("iter.Value() != ", 14, " value =", iter.Value())
|
||||||
|
}
|
||||||
|
|
||||||
|
iter.ToTail()
|
||||||
|
if iter.Value() != 30 {
|
||||||
|
t.Error("iter.Value() != ", 30, " value =", iter.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestIterator(t *testing.T) {
|
func TestIterator(t *testing.T) {
|
||||||
tree := New(compare.Int)
|
tree := New(compare.Int)
|
||||||
for _, v := range []int{1, 2, 7, 4, 5, 6, 7, 14, 15, 20, 30, 21, 3} {
|
for _, v := range []int{1, 2, 7, 4, 5, 6, 7, 14, 15, 20, 30, 21, 3} {
|
||||||
|
|
|
@ -30,6 +30,16 @@ func NewIteratorWithCap(n *Node, cap int) *Iterator {
|
||||||
return iter
|
return iter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToHead() {
|
||||||
|
for iter.Prev() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToTail() {
|
||||||
|
for iter.Next() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (iter *Iterator) GetNode() *Node {
|
func (iter *Iterator) GetNode() *Node {
|
||||||
return iter.cur
|
return iter.cur
|
||||||
}
|
}
|
||||||
|
@ -44,24 +54,6 @@ func (iter *Iterator) Value() interface{} {
|
||||||
return iter.cur.value
|
return iter.cur.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Left() bool {
|
|
||||||
if iter.cur.children[0] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[0]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) Right() bool {
|
|
||||||
if iter.cur.children[1] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[1]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
||||||
|
|
||||||
// iter := NewIterator(cur)
|
// iter := NewIterator(cur)
|
||||||
|
|
|
@ -46,14 +46,14 @@ func (tree *Tree) String() string {
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tree *Tree) Iterator() *Iterator {
|
|
||||||
return initIterator(tree)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tree *Tree) Size() int {
|
func (tree *Tree) Size() int {
|
||||||
return tree.size
|
return tree.size
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tree *Tree) Iterator() *Iterator {
|
||||||
|
return initIterator(tree)
|
||||||
|
}
|
||||||
|
|
||||||
func (tree *Tree) Remove(key interface{}) (interface{}, bool) {
|
func (tree *Tree) Remove(key interface{}) (interface{}, bool) {
|
||||||
|
|
||||||
if n, ok := tree.GetNode(key); ok {
|
if n, ok := tree.GetNode(key); ok {
|
||||||
|
|
|
@ -30,6 +30,16 @@ func NewIteratorWithCap(n *Node, cap int) *Iterator {
|
||||||
return iter
|
return iter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToHead() {
|
||||||
|
for iter.Prev() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToTail() {
|
||||||
|
for iter.Next() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (iter *Iterator) GetNode() *Node {
|
func (iter *Iterator) GetNode() *Node {
|
||||||
return iter.cur
|
return iter.cur
|
||||||
}
|
}
|
||||||
|
@ -44,24 +54,6 @@ func (iter *Iterator) Value() interface{} {
|
||||||
return iter.cur.value
|
return iter.cur.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Left() bool {
|
|
||||||
if iter.cur.children[0] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[0]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) Right() bool {
|
|
||||||
if iter.cur.children[1] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[1]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
||||||
|
|
||||||
// iter := NewIterator(cur)
|
// iter := NewIterator(cur)
|
||||||
|
|
|
@ -30,6 +30,16 @@ func NewIteratorWithCap(n *Node, cap int) *Iterator {
|
||||||
return iter
|
return iter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToHead() {
|
||||||
|
for iter.Prev() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToTail() {
|
||||||
|
for iter.Next() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (iter *Iterator) GetNode() *Node {
|
func (iter *Iterator) GetNode() *Node {
|
||||||
return iter.cur
|
return iter.cur
|
||||||
}
|
}
|
||||||
|
@ -44,24 +54,6 @@ func (iter *Iterator) Value() interface{} {
|
||||||
return iter.cur.value
|
return iter.cur.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Left() bool {
|
|
||||||
if iter.cur.children[0] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[0]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) Right() bool {
|
|
||||||
if iter.cur.children[1] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[1]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
||||||
|
|
||||||
// iter := NewIterator(cur)
|
// iter := NewIterator(cur)
|
||||||
|
|
|
@ -30,6 +30,16 @@ func NewIteratorWithCap(n *Node, cap int) *Iterator {
|
||||||
return iter
|
return iter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToHead() {
|
||||||
|
for iter.Prev() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToTail() {
|
||||||
|
for iter.Next() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (iter *Iterator) GetNode() *Node {
|
func (iter *Iterator) GetNode() *Node {
|
||||||
return iter.cur
|
return iter.cur
|
||||||
}
|
}
|
||||||
|
@ -44,24 +54,6 @@ func (iter *Iterator) Value() interface{} {
|
||||||
return iter.cur.value
|
return iter.cur.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Left() bool {
|
|
||||||
if iter.cur.children[0] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[0]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) Right() bool {
|
|
||||||
if iter.cur.children[1] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[1]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
||||||
|
|
||||||
// iter := NewIterator(cur)
|
// iter := NewIterator(cur)
|
||||||
|
|
|
@ -30,6 +30,16 @@ func NewIteratorWithCap(n *Node, cap int) *Iterator {
|
||||||
return iter
|
return iter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToHead() {
|
||||||
|
for iter.Prev() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToTail() {
|
||||||
|
for iter.Next() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (iter *Iterator) GetNode() *Node {
|
func (iter *Iterator) GetNode() *Node {
|
||||||
return iter.cur
|
return iter.cur
|
||||||
}
|
}
|
||||||
|
@ -44,24 +54,6 @@ func (iter *Iterator) Value() interface{} {
|
||||||
return iter.cur.value
|
return iter.cur.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Left() bool {
|
|
||||||
if iter.cur.children[0] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[0]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) Right() bool {
|
|
||||||
if iter.cur.children[1] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[1]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
||||||
|
|
||||||
// iter := NewIterator(cur)
|
// iter := NewIterator(cur)
|
||||||
|
|
|
@ -34,6 +34,16 @@ func (iter *Iterator) GetNode() *Node {
|
||||||
return iter.cur
|
return iter.cur
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToHead() {
|
||||||
|
for iter.Prev() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iter *Iterator) ToTail() {
|
||||||
|
for iter.Next() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (iter *Iterator) SetNode(n *Node) {
|
func (iter *Iterator) SetNode(n *Node) {
|
||||||
iter.up = n
|
iter.up = n
|
||||||
iter.dir = 0
|
iter.dir = 0
|
||||||
|
@ -44,24 +54,6 @@ func (iter *Iterator) Value() interface{} {
|
||||||
return iter.cur.value
|
return iter.cur.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) Left() bool {
|
|
||||||
if iter.cur.children[0] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[0]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) Right() bool {
|
|
||||||
if iter.cur.children[1] != nil {
|
|
||||||
iter.dir = 0
|
|
||||||
iter.cur = iter.cur.children[1]
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
|
||||||
|
|
||||||
// iter := NewIterator(cur)
|
// iter := NewIterator(cur)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user