缘起

最近阅读<<我的第一本算法书>>(【日】石田保辉;宫崎修一)
本系列笔记拟采用golang练习之

二叉查找树

  1. 二叉查找树(又叫作二叉搜索树或二叉排序树)是一种数据结构,
  2. 数据存储于二叉查找树的各个结点中。
  3. 二叉查找树有两个性质:
  4. 第一个是每个结点的值均大于其左子树上任意一个结点的值,
  5. 第二个是每个结点的值均小于其右子树上任意一个结点的值。
  6. 根据这两个性质可以得到以下结论。
  7. 首先,二叉查找树的最小结点要从顶端开始,往其左下的末端寻找。
  8. 反过来,二叉查找树的最大结点要从顶端开始,往其右下的末端寻找。
  9. 摘自 <<我的第一本算法书>> 【日】石田保辉;宫崎修一

目标

  • 实现一棵二叉查找树, 并测试其基本功能

设计

  • IComparator: 定义值比较函数. 值比较函数可以返回小于, 等于, 大于三种情况
  • IBinarySearchTree: 定义二叉查找树的接口, 增删改查都要.
  • IIterator: 定义二叉查找树的遍历接口.
  • tComparator: 值比较函数的包装器, 实现IComparator接口. 具体比较函数由外部传入.
  • tBinarySearchTree: 二叉查找树的示例, 实现IBinarySearchTree接口.
  • tBinaryNode: 二叉查找树节点
  • tBSTreeIterator: 二叉查找树的遍历迭代器, 内部使用广度优先搜索+候选队列.

单元测试

bstree_test.go, 测试二叉查找树的增删改查, 以及大小序输出.

  1. package data_structure
  2. import (
  3. "fmt"
  4. bstree "learning/gooop/data_structure/binary_search_tree"
  5. "math/rand"
  6. "strings"
  7. "testing"
  8. "time"
  9. )
  10. func Test_BinarySearchTree(t *testing.T) {
  11. fnAssertTrue := func(b bool, msg string) {
  12. if !b {
  13. panic(msg)
  14. }
  15. }
  16. fnCompare := func(a interface{}, b interface{}) bstree.CompareResult {
  17. i1 := a.(int)
  18. i2 := b.(int)
  19. if i1 < i2 {
  20. return bstree.LESS
  21. } else if i1 == i2 {
  22. return bstree.EQUAL
  23. } else {
  24. return bstree.GREATER
  25. }
  26. }
  27. comparator := bstree.NewComparator(fnCompare)
  28. // test empty tree
  29. tree := bstree.NewBinarySearchTree(comparator)
  30. t.Log(tree)
  31. fnAssertTrue(tree.String() == "r=nil,s=0,v=0", "expecting r=nil,s=0,v=0")
  32. fnAssertTrue(tree.Size() == 0, "expecting size == 0")
  33. fnAssertTrue(tree.IsEmpty(), "expecting empty")
  34. // test one item
  35. tree.Push(5)
  36. t.Log(tree)
  37. fnAssertTrue(tree.String() == "r=5,s=1,v=1 5(n,n)", "expecting r=5,s=1,v=1 5(n,n)")
  38. fnAssertTrue(tree.Size() == 1, "expecting size == 1")
  39. fnAssertTrue(tree.IsNotEmpty(), "expecting not empty")
  40. // test min
  41. ok, v := tree.Min()
  42. fnAssertTrue(ok, "expecting min() ok")
  43. fnAssertTrue(v == 5, "expecting 5")
  44. // test max
  45. ok, v = tree.Max()
  46. fnAssertTrue(ok, "expecting max() ok")
  47. fnAssertTrue(v == 5, "expecting 5")
  48. fnAssertTrue(tree.String() == "r=5,s=1,v=1 5(n,n)", "expecting r=5,s=1,v=1 5(n,n)")
  49. // test pop one
  50. ok, v = tree.PopMin()
  51. t.Log(tree)
  52. fnAssertTrue(tree.String() == "r=nil,s=0,v=2", "expecting r=nil,s=0,v=2")
  53. fnAssertTrue(ok, "expecting PopMin() ok")
  54. fnAssertTrue(v == 5, "expecting 5")
  55. fnAssertTrue(tree.Size() == 0, "expecting size == 0")
  56. fnAssertTrue(tree.IsEmpty(), "expecting empty")
  57. // test batch push
  58. samples := []int{ 5,4,8, 2, 7, 9, 1,3,6 }
  59. for i := 0;i < len(samples);i++ {
  60. tree.Push(samples[i])
  61. }
  62. t.Log(tree)
  63. fnAssertTrue(tree.Size() == len(samples), "expecting Size() == len(samples)")
  64. fnAssertTrue(tree.String() == "r=5,s=9,v=11 5(4,8),4(2,n),8(7,9),2(1,3),7(6,n),9(n,n),1(n,n),3(n,n),6(n,n)", "expecting r=5,s=9,v=11 5(4,8),4(2,n),8(7,9),2(1,3),7(6,n),9(n,n),1(n,n),3(n,n),6(n,n)")
  65. for _,it := range samples {
  66. fnAssertTrue(tree.Has(it), "expecting Has() == true")
  67. }
  68. // test iterator
  69. iter := tree.Iterator()
  70. fnAssertTrue(iter.More(), "expectiong More()")
  71. iterItems := make([]string, 0)
  72. for range samples {
  73. ok,v = iter.Next()
  74. t.Logf("ok=%v, v=%v", true, v)
  75. fnAssertTrue(ok, "expectiong Next()")
  76. iterItems = append(iterItems, fmt.Sprintf("%v", v))
  77. }
  78. fnAssertTrue(strings.Join(iterItems, ",") == "5,4,8,2,7,9,1,3,6", "expecting 5,4,8,2,7,9,1,3,6")
  79. fnAssertTrue(iter.More() == false, "expectiong !iter.More()")
  80. ok,v = iter.Next()
  81. fnAssertTrue(!ok, "expecting !iter.Next()")
  82. // test min
  83. ok,v = tree.Min()
  84. fnAssertTrue(ok, "expecting ok")
  85. fnAssertTrue(v == 1, "expection Min() == 1")
  86. // test max
  87. ok,v = tree.Max()
  88. fnAssertTrue(ok, "expecting ok")
  89. fnAssertTrue(v == 9, "expection Max() == 9")
  90. // test batch pop min
  91. for i := 1;i <= 9;i ++ {
  92. ok,v = tree.PopMin()
  93. t.Logf("i=%v v=%v tree=%s", i, v, tree.String())
  94. fnAssertTrue(ok, "expecting ok")
  95. fnAssertTrue(v == i, fmt.Sprintf("expecting %v", i))
  96. }
  97. // test batch pop max
  98. for i := 0;i < len(samples);i++ {
  99. tree.Push(samples[i])
  100. }
  101. t.Log(tree)
  102. for i := 1;i <= 9;i ++ {
  103. ok,v = tree.PopMax()
  104. t.Logf("i=%v v=%v tree=%s", i, v, tree.String())
  105. fnAssertTrue(ok, "expecting ok")
  106. fnAssertTrue(v == 10 - i, fmt.Sprintf("expecting %v", 10 - i))
  107. }
  108. // test batch push
  109. samples = []int{ 2,1,3 }
  110. for i := 0;i < len(samples);i++ {
  111. tree.Push(samples[i])
  112. }
  113. t.Log(tree)
  114. fnAssertTrue(tree.String() == "r=2,s=3,v=41 2(1,3),1(n,n),3(n,n)", "expecting 2(1,3),1(n,n),3(n,n)")
  115. // test clear
  116. tree.Clear()
  117. t.Log(tree)
  118. fnAssertTrue(tree.String() == "r=nil,s=0,v=42", "expecting empty")
  119. // test batch remove
  120. rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
  121. rndItems := make(map[int]bool, 0)
  122. for i := 0;i < 10000;i++ {
  123. x := rnd.Intn(50000)
  124. tree.Push(x)
  125. rndItems[x] = true
  126. }
  127. for k,_ := range rndItems {
  128. //t.Logf("removing %v", k)
  129. fnAssertTrue(tree.Remove(k), "expecting Remove() = true")
  130. //t.Log(tree)
  131. }
  132. t.Log(tree)
  133. fnAssertTrue(tree.IsEmpty(), "expecting empty")
  134. }

测试输出

  1. $ go test -v bstree_test.go
  2. === RUN Test_BinarySearchTree
  3. bstree_test.go:35: r=nil,s=0,v=0
  4. bstree_test.go:42: r=5,s=1,v=1 5(n,n)
  5. bstree_test.go:60: r=nil,s=0,v=2
  6. bstree_test.go:72: r=5,s=9,v=11 5(4,8),4(2,n),8(7,9),2(1,3),7(6,n),9(n,n),1(n,n),3(n,n),6(n,n)
  7. bstree_test.go:86: ok=true, v=5
  8. bstree_test.go:86: ok=true, v=4
  9. bstree_test.go:86: ok=true, v=8
  10. bstree_test.go:86: ok=true, v=2
  11. bstree_test.go:86: ok=true, v=7
  12. bstree_test.go:86: ok=true, v=9
  13. bstree_test.go:86: ok=true, v=1
  14. bstree_test.go:86: ok=true, v=3
  15. bstree_test.go:86: ok=true, v=6
  16. bstree_test.go:108: i=1 v=1 tree=r=5,s=8,v=12 5(4,8),4(2,n),8(7,9),2(n,3),7(6,n),9(n,n),3(n,n),6(n,n)
  17. bstree_test.go:108: i=2 v=2 tree=r=5,s=7,v=13 5(4,8),4(3,n),8(7,9),3(n,n),7(6,n),9(n,n),6(n,n)
  18. bstree_test.go:108: i=3 v=3 tree=r=5,s=6,v=14 5(4,8),4(n,n),8(7,9),7(6,n),9(n,n),6(n,n)
  19. bstree_test.go:108: i=4 v=4 tree=r=5,s=5,v=15 5(n,8),8(7,9),7(6,n),9(n,n),6(n,n)
  20. bstree_test.go:108: i=5 v=5 tree=r=8,s=4,v=16 8(7,9),7(6,n),9(n,n),6(n,n)
  21. bstree_test.go:108: i=6 v=6 tree=r=8,s=3,v=17 8(7,9),7(n,n),9(n,n)
  22. bstree_test.go:108: i=7 v=7 tree=r=8,s=2,v=18 8(n,9),9(n,n)
  23. bstree_test.go:108: i=8 v=8 tree=r=9,s=1,v=19 9(n,n)
  24. bstree_test.go:108: i=9 v=9 tree=r=nil,s=0,v=20
  25. bstree_test.go:117: r=5,s=9,v=29 5(4,8),4(2,n),8(7,9),2(1,3),7(6,n),9(n,n),1(n,n),3(n,n),6(n,n)
  26. bstree_test.go:120: i=1 v=9 tree=r=5,s=8,v=30 5(4,8),4(2,n),8(7,n),2(1,3),7(6,n),1(n,n),3(n,n),6(n,n)
  27. bstree_test.go:120: i=2 v=8 tree=r=5,s=7,v=31 5(4,7),4(2,n),7(6,n),2(1,3),6(n,n),1(n,n),3(n,n)
  28. bstree_test.go:120: i=3 v=7 tree=r=5,s=6,v=32 5(4,6),4(2,n),6(n,n),2(1,3),1(n,n),3(n,n)
  29. bstree_test.go:120: i=4 v=6 tree=r=5,s=5,v=33 5(4,n),4(2,n),2(1,3),1(n,n),3(n,n)
  30. bstree_test.go:120: i=5 v=5 tree=r=4,s=4,v=34 4(2,n),2(1,3),1(n,n),3(n,n)
  31. bstree_test.go:120: i=6 v=4 tree=r=2,s=3,v=35 2(1,3),1(n,n),3(n,n)
  32. bstree_test.go:120: i=7 v=3 tree=r=2,s=2,v=36 2(1,n),1(n,n)
  33. bstree_test.go:120: i=8 v=2 tree=r=1,s=1,v=37 1(n,n)
  34. bstree_test.go:120: i=9 v=1 tree=r=nil,s=0,v=38
  35. bstree_test.go:130: r=2,s=3,v=41 2(1,3),1(n,n),3(n,n)
  36. bstree_test.go:135: r=nil,s=0,v=42
  37. bstree_test.go:151: r=nil,s=0,v=18146
  38. --- PASS: Test_BinarySearchTree (0.01s)
  39. PASS
  40. ok command-line-arguments 0.012s

IComparator.go

定义值比较函数. 值比较函数可以返回小于, 等于, 大于三种情况

  1. package binary_search_tree
  2. type IComparator interface {
  3. Compare(a interface{}, b interface{}) CompareResult
  4. }
  5. type CompareResult int
  6. const LESS CompareResult = -1
  7. const EQUAL CompareResult = 0
  8. const GREATER CompareResult = 1

IBinarySearchTree.go

定义二叉查找树的接口, 增删改查都要.

  1. package binary_search_tree
  2. type IBinarySearchTree interface {
  3. Size() int
  4. IsEmpty() bool
  5. IsNotEmpty() bool
  6. Push(value interface{})
  7. Min() (bool, interface{})
  8. Max() (bool, interface{})
  9. Has(value interface{}) bool
  10. PopMin() (bool, interface{})
  11. PopMax() (bool, interface{})
  12. Remove(value interface{}) bool
  13. Clear()
  14. Iterator() IIterator
  15. String() string
  16. }

IIterator.go

定义二叉查找树的遍历接口.

  1. package binary_search_tree
  2. type IIterator interface {
  3. More() bool
  4. Next() (bool,interface{})
  5. }

tComparator.go

值比较函数的包装器, 实现IComparator接口. 具体比较函数由外部传入.

  1. package binary_search_tree
  2. import "errors"
  3. type FnCompare func(a interface{}, b interface{}) CompareResult
  4. type tComparator struct {
  5. fnCompare FnCompare
  6. }
  7. func NewComparator(fn FnCompare) IComparator {
  8. if fn == nil {
  9. panic(gNullArgumentError)
  10. }
  11. return &tComparator{
  12. fnCompare: fn,
  13. }
  14. }
  15. func (me *tComparator) Compare(a interface{}, b interface{}) CompareResult {
  16. if a == nil || b == nil {
  17. panic(gNullArgumentError)
  18. }
  19. return me.fnCompare(a, b)
  20. }
  21. var gNullArgumentError = errors.New("null argument error")

tBinarySearchTree.go

二叉查找树的示例, 实现IBinarySearchTree接口.

  1. package binary_search_tree
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. type tBinarySearchTree struct {
  7. comparator IComparator
  8. root *tBinaryNode
  9. size int
  10. version uint64
  11. }
  12. func NewBinarySearchTree(comparator IComparator) IBinarySearchTree {
  13. return &tBinarySearchTree{
  14. comparator: comparator,
  15. root: nil,
  16. size: 0,
  17. version: 0,
  18. }
  19. }
  20. func (me *tBinarySearchTree) Size() int {
  21. return me.size
  22. }
  23. func (me *tBinarySearchTree) IsEmpty() bool {
  24. return me.size <= 0
  25. }
  26. func (me *tBinarySearchTree) IsNotEmpty() bool {
  27. return !me.IsEmpty()
  28. }
  29. func (me *tBinarySearchTree) Push(value interface{}) {
  30. if me.IsEmpty() {
  31. me.root = me.append(value)
  32. return
  33. }
  34. for node := me.root; node != nil; {
  35. r := me.comparator.Compare(value, node.value)
  36. switch r {
  37. case EQUAL:
  38. return
  39. case LESS:
  40. if node.left == nil {
  41. node.LChild(me.append(value))
  42. return
  43. } else {
  44. node = node.left
  45. }
  46. break
  47. case GREATER:
  48. if node.right == nil {
  49. node.RChild(me.append(value))
  50. return
  51. } else {
  52. node = node.right
  53. }
  54. break
  55. }
  56. }
  57. }
  58. func (me *tBinarySearchTree) append(value interface{}) *tBinaryNode {
  59. me.size++
  60. me.version++
  61. return newBinaryNode(value)
  62. }
  63. func (me *tBinarySearchTree) Min() (bool, interface{}) {
  64. ok, node := me.getMinNode(me.root)
  65. if !ok {
  66. return false, nil
  67. }
  68. return true, node.value
  69. }
  70. func (me *tBinarySearchTree) Max() (bool, interface{}) {
  71. ok, node := me.getMaxNode(me.root)
  72. if !ok {
  73. return false, nil
  74. }
  75. return true, node.value
  76. }
  77. func (me *tBinarySearchTree) Has(value interface{}) bool {
  78. ok, _ := me.find(value)
  79. return ok
  80. }
  81. func (me *tBinarySearchTree) find(value interface{}) (ok bool, node *tBinaryNode) {
  82. if me.IsEmpty() {
  83. return false, nil
  84. }
  85. for node = me.root; node != nil; {
  86. r := me.comparator.Compare(value, node.value)
  87. switch r {
  88. case EQUAL:
  89. return true, node
  90. case LESS:
  91. if node.left == nil {
  92. return false, nil
  93. } else {
  94. node = node.left
  95. }
  96. break
  97. case GREATER:
  98. if node.right == nil {
  99. return false, nil
  100. } else {
  101. node = node.right
  102. }
  103. break
  104. }
  105. }
  106. return false, nil
  107. }
  108. func (me *tBinarySearchTree) getMinNode(from *tBinaryNode) (ok bool, left *tBinaryNode) {
  109. if from == nil {
  110. return false, nil
  111. }
  112. left = from.left
  113. if left == nil {
  114. return true, from
  115. }
  116. for {
  117. if left.left == nil {
  118. return true, left
  119. }
  120. left = left.left
  121. }
  122. }
  123. func (me *tBinarySearchTree) getMaxNode(from *tBinaryNode) (ok bool, right *tBinaryNode) {
  124. if from == nil {
  125. return false, nil
  126. }
  127. right = from.right
  128. if right == nil {
  129. return true, from
  130. }
  131. for {
  132. if right.right == nil {
  133. return true, right
  134. }
  135. right = right.right
  136. }
  137. }
  138. func (me *tBinarySearchTree) PopMin() (bool, interface{}) {
  139. ok, node := me.getMinNode(me.root)
  140. if !ok {
  141. return false, nil
  142. }
  143. value := node.value
  144. me.removeNode(node)
  145. me.size--
  146. me.version++
  147. return true, value
  148. }
  149. func (me *tBinarySearchTree) removeNode(node *tBinaryNode) {
  150. //var pv interface{} = "nil"
  151. //if node.parent != nil {
  152. // pv = node.parent.value
  153. //}
  154. //fmt.Printf("removeNode %v.%v\n", pv, node.value)
  155. left := node.left
  156. right := node.right
  157. if node.parent == nil {
  158. switch node.childrenCount() {
  159. case 0:
  160. me.root = nil
  161. break
  162. case 1:
  163. if left != nil {
  164. me.root = left
  165. left.SetParent(nil)
  166. } else if right != nil {
  167. me.root = right
  168. right.SetParent(nil)
  169. }
  170. default:
  171. _, n := me.getMaxNode(left)
  172. if n == left {
  173. me.root = n
  174. n.SetParent(nil)
  175. n.RChild(right)
  176. } else {
  177. me.root.value = n.value
  178. me.removeNode(n)
  179. }
  180. }
  181. } else {
  182. parent := node.parent
  183. switch node.childrenCount() {
  184. case 0:
  185. if parent.left == node {
  186. parent.left = nil
  187. } else {
  188. parent.right = nil
  189. }
  190. break
  191. case 1:
  192. if left != nil {
  193. if parent.left == node {
  194. parent.LChild(left)
  195. } else {
  196. parent.RChild(left)
  197. }
  198. } else if right != nil {
  199. if parent.left == node {
  200. parent.LChild(right)
  201. } else {
  202. parent.RChild(right)
  203. }
  204. }
  205. default:
  206. _, n := me.getMaxNode(left)
  207. if n == left {
  208. if parent.left == node {
  209. parent.LChild(n)
  210. } else {
  211. parent.RChild(n)
  212. }
  213. n.RChild(right)
  214. } else {
  215. node.value = n.value
  216. me.removeNode(n)
  217. }
  218. }
  219. }
  220. }
  221. func (me *tBinarySearchTree) PopMax() (bool, interface{}) {
  222. ok, node := me.getMaxNode(me.root)
  223. if !ok {
  224. return false, nil
  225. }
  226. me.removeNode(node)
  227. me.size--
  228. me.version++
  229. return true, node.value
  230. }
  231. func (me *tBinarySearchTree) Remove(value interface{}) bool {
  232. ok, node := me.find(value)
  233. if !ok {
  234. return false
  235. }
  236. me.removeNode(node)
  237. me.size--
  238. me.version++
  239. return true
  240. }
  241. func (me *tBinarySearchTree) Clear() {
  242. if me.IsEmpty() {
  243. return
  244. }
  245. me.root = nil
  246. me.size = 0
  247. me.version++
  248. }
  249. func (me *tBinarySearchTree) Iterator() IIterator {
  250. return newBSTreeIterator(me)
  251. }
  252. func (me *tBinarySearchTree) String() string {
  253. queue := newVisitQeuue()
  254. queue.push(me.root)
  255. items := make([]string, 0)
  256. for ;queue.more(); {
  257. ok, node := queue.poll()
  258. if ok {
  259. queue.push(node.left)
  260. queue.push(node.right)
  261. var lv interface{} = "n"
  262. if node.left != nil {
  263. lv = node.left.value
  264. }
  265. var rv interface{} = "n"
  266. if node.right != nil {
  267. rv = node.right.value
  268. }
  269. items = append(items, fmt.Sprintf("%v(%v,%v)", node.value, lv,rv))
  270. } else {
  271. break
  272. }
  273. }
  274. r := "nil"
  275. if me.root != nil {
  276. r = fmt.Sprintf("%v", me.root.value)
  277. }
  278. if len(items) > 0 {
  279. return fmt.Sprintf("r=%v,s=%v,v=%v %s", r, me.size, me.version, strings.Join(items, ","))
  280. } else {
  281. return fmt.Sprintf("r=%v,s=%v,v=%v", r, me.size, me.version)
  282. }
  283. }

tBinaryNode.go

二叉查找树节点

  1. package binary_search_tree
  2. type tBinaryNode struct {
  3. value interface{}
  4. parent *tBinaryNode
  5. left *tBinaryNode
  6. right *tBinaryNode
  7. }
  8. func newBinaryNode(value interface{}) *tBinaryNode {
  9. return &tBinaryNode{
  10. value: value,
  11. left: nil,
  12. right: nil,
  13. }
  14. }
  15. func (me *tBinaryNode) childrenCount() int {
  16. left := me.left
  17. right := me.right
  18. if left == nil && right == nil {
  19. return 0
  20. }
  21. if left == nil || right == nil {
  22. return 1
  23. }
  24. return 2
  25. }
  26. func (me *tBinaryNode) LChild(node *tBinaryNode) {
  27. me.left = node
  28. if node != nil {
  29. node.SetParent(me)
  30. }
  31. }
  32. func (me *tBinaryNode) SetParent(parent *tBinaryNode) {
  33. if me.parent == parent {
  34. return
  35. }
  36. if me.parent != nil {
  37. if me.parent.left == me {
  38. me.parent.left = nil
  39. } else if me.parent.right == me {
  40. me.parent.right = nil
  41. }
  42. }
  43. me.parent = parent
  44. }
  45. func (me *tBinaryNode) RChild(node *tBinaryNode) {
  46. me.right = node
  47. if node != nil {
  48. node.SetParent(me)
  49. }
  50. }

tBSTreeIterator.go

二叉查找树的遍历迭代器, 内部使用广度优先搜索+候选队列.

  1. package binary_search_tree
  2. type tBSTreeIterator struct {
  3. tree *tBinarySearchTree
  4. queue *tVisitQueue
  5. version uint64
  6. }
  7. type tVisitQueue struct {
  8. head *tQueuedNode
  9. tail *tQueuedNode
  10. }
  11. type tQueuedNode struct {
  12. node *tBinaryNode
  13. next *tQueuedNode
  14. }
  15. func newQueuedNode(node *tBinaryNode) *tQueuedNode {
  16. return &tQueuedNode{
  17. node: node,
  18. next: nil,
  19. }
  20. }
  21. func newVisitQeuue() *tVisitQueue {
  22. return &tVisitQueue{
  23. nil,
  24. nil,
  25. }
  26. }
  27. func (me *tVisitQueue) push(node *tBinaryNode) {
  28. if node == nil {
  29. return
  30. }
  31. qn := newQueuedNode(node)
  32. if me.head == nil {
  33. me.head = qn
  34. me.tail = qn
  35. } else {
  36. me.tail.next = qn
  37. me.tail = qn
  38. }
  39. }
  40. func (me *tVisitQueue) poll() (bool, *tBinaryNode) {
  41. if me.head == nil {
  42. return false, nil
  43. } else {
  44. it := me.head
  45. if it == me.tail {
  46. me.tail = nil
  47. }
  48. me.head = me.head.next
  49. return true, it.node
  50. }
  51. }
  52. func (me *tVisitQueue) more() bool {
  53. return me.head != nil
  54. }
  55. func newBSTreeIterator(tree *tBinarySearchTree) IIterator {
  56. it := &tBSTreeIterator{
  57. tree: tree,
  58. queue: newVisitQeuue(),
  59. version: tree.version,
  60. }
  61. it.queue.push(tree.root)
  62. return it
  63. }
  64. func (me *tBSTreeIterator) More() bool {
  65. if me.version != me.tree.version {
  66. return false
  67. } else {
  68. return me.queue.more()
  69. }
  70. }
  71. func (me *tBSTreeIterator) Next() (bool, interface{}) {
  72. if !me.More() {
  73. return false, nil
  74. }
  75. ok, node := me.queue.poll()
  76. if !ok {
  77. return false, nil
  78. }
  79. me.queue.push(node.left)
  80. me.queue.push(node.right)
  81. return true, node.value
  82. }

(end)