bst.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package bst
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. type Node struct {
  7. e interface{}
  8. left *Node
  9. right *Node
  10. }
  11. type Bst struct {
  12. root *Node
  13. size int64
  14. }
  15. func New() *Bst {
  16. return new(Bst)
  17. }
  18. func (b *Bst) GetSize() int64 {
  19. return b.size
  20. }
  21. func (b *Bst) IsEmpty() bool {
  22. return b.size == 0
  23. }
  24. func (b *Bst) Add(e interface{}) {
  25. b.root = b.add(b.root, e)
  26. // fmt.Println(b.size)
  27. }
  28. // func (b *Bst) add(e interface{}, root *Node) *Node {
  29. // if root == nil {
  30. // b.size++
  31. // return &Node{e: e}
  32. // }
  33. // if Compare(e, root.e) > 0 {
  34. // root.left = b.add(e, root.left)
  35. // } else if Compare(e, root.e) < 0 {
  36. // root.right = b.add(e, root.right)
  37. // }
  38. // return root
  39. // }
  40. func (b *Bst) add(n *Node, e interface{}) *Node {
  41. if n == nil {
  42. b.size++
  43. return &Node{e: e}
  44. }
  45. // 递归调用
  46. if Compare(e, n.e) < 0 {
  47. n.left = b.add(n.left, e)
  48. } else if Compare(e, n.e) > 0 {
  49. n.right = b.add(n.right, e)
  50. }
  51. return n
  52. }
  53. func (b *Bst) GetList() {
  54. // fmt.Println(b.root)
  55. b.getList(b.root)
  56. }
  57. func (b *Bst) getList(root *Node) {
  58. if root == nil {
  59. return
  60. }
  61. b.getList(root.left)
  62. fmt.Println(root.e)
  63. b.getList(root.right)
  64. }
  65. func (b *Bst) Contains(e interface{}) bool {
  66. return b.contains(b.root, e)
  67. }
  68. func (b *Bst) contains(root *Node, e interface{}) bool {
  69. if root == nil {
  70. return false
  71. }
  72. if Compare(root.e, e) > 0 {
  73. return b.contains(root.left, e)
  74. } else if Compare(root.e, e) < 0 {
  75. return b.contains(root.right, e)
  76. } else {
  77. return true
  78. }
  79. }
  80. func (b *Bst) Remove(e interface{}) {
  81. b.root = b.remove(b.root, e)
  82. }
  83. func (b *Bst) remove(root *Node, e interface{}) *Node {
  84. if root == nil {
  85. return nil
  86. }
  87. if Compare(root.e, e) > 0 {
  88. root.left = b.remove(root.left, e)
  89. } else if Compare(root.e, e) < 0 {
  90. root.right = b.remove(root.right, e)
  91. } else {
  92. if root.left != nil && root.right == nil {
  93. b.size--
  94. return root.left
  95. } else if root.left == nil && root.right != nil {
  96. b.size--
  97. return root.right
  98. } else if root.left == nil && root.right == nil {
  99. return nil
  100. } else {
  101. ret := root.right
  102. for ret.left != nil {
  103. ret = ret.left
  104. }
  105. ret.left = root.left
  106. ret.right = root.right
  107. b.size--
  108. }
  109. }
  110. return root
  111. }
  112. func (b *Bst) Minimum() interface{} {
  113. if b.size == 0 {
  114. panic("BST is empty!")
  115. }
  116. return b.minimum(b.root).e
  117. }
  118. func (b *Bst) minimum(n *Node) *Node {
  119. if n.left == nil {
  120. return n
  121. }
  122. return b.minimum(n.left)
  123. }
  124. func (b *Bst) Maxmum() interface{} {
  125. if b.size == 0 {
  126. panic("BST is empty!")
  127. }
  128. return b.maximum(b.root).e
  129. }
  130. func (b *Bst) maximum(n *Node) *Node {
  131. if n.right == nil {
  132. return n
  133. }
  134. return b.maximum(n.right)
  135. }
  136. // func (b *Bst) Maximum() interface{} {
  137. // if b.size == 0 {
  138. // panic("BST is empty!")
  139. // }
  140. // return maximum(b.root).e
  141. // }
  142. // // 返回以 Node 为根的二分搜索树的最大值所在的节点
  143. // func maximum(n *Node) *Node {
  144. // if n.right == nil {
  145. // return n
  146. // }
  147. // return maximum(n.right)
  148. // }
  149. func Compare(a interface{}, b interface{}) int {
  150. aType := reflect.TypeOf(a).String()
  151. bType := reflect.TypeOf(b).String()
  152. if aType != bType {
  153. panic("cannot compare different type params")
  154. }
  155. switch a.(type) {
  156. case int:
  157. if a.(int) > b.(int) {
  158. return 1
  159. } else if a.(int) < b.(int) {
  160. return -1
  161. } else {
  162. return 0
  163. }
  164. case string:
  165. if a.(string) > b.(string) {
  166. return 1
  167. } else if a.(string) < b.(string) {
  168. return -1
  169. } else {
  170. return 0
  171. }
  172. case float64:
  173. if a.(float64) > b.(float64) {
  174. return 1
  175. } else if a.(float64) < b.(float64) {
  176. return -1
  177. } else {
  178. return 0
  179. }
  180. default:
  181. panic("unsupported type params")
  182. }
  183. }