Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.28 KB | None | 0 0
  1. type color bool
  2.  
  3. const (
  4. black color = true
  5. red color = false
  6. )
  7.  
  8. // RBNode of tree
  9. type RBNode struct {
  10. key int
  11. color color
  12. left, right *RBNode
  13. p *RBNode
  14. }
  15.  
  16. // RBTree is black and red tree
  17. type RBTree struct {
  18. null *RBNode
  19. root *RBNode
  20. }
  21.  
  22. // CreateRBTree create a tree
  23. func CreateRBTree(A []int) RBTree {
  24. r := RBTree{
  25. null: &RBNode{color: black},
  26. }
  27. r.root = r.null
  28. for _, a := range A {
  29. r.Insert(&RBNode{key: a})
  30. }
  31. return r
  32. }
  33.  
  34. // InOrder performs inorder walk
  35. func (r *RBTree) InOrder(x *RBNode) []int {
  36. var A []int
  37. if x != r.null {
  38. A = append(A, r.InOrder(x.left)...)
  39. A = append(A, x.key)
  40. A = append(A, r.InOrder(x.right)...)
  41. }
  42. return A
  43. }
  44.  
  45. // PreOrder performs preorder walk
  46. func (r *RBTree) PreOrder(x *RBNode) []int {
  47. var A []int
  48. if x != r.null {
  49. A = append(A, x.key)
  50. A = append(A, r.InOrder(x.left)...)
  51. A = append(A, r.InOrder(x.right)...)
  52. }
  53. return A
  54. }
  55.  
  56. // PostOrder performs postorder walk
  57. func (r *RBTree) PostOrder(x *RBNode) []int {
  58. var A []int
  59. if x != r.null {
  60. A = append(A, r.InOrder(x.left)...)
  61. A = append(A, r.InOrder(x.right)...)
  62. A = append(A, x.key)
  63. }
  64. return A
  65. }
  66.  
  67. // Search for a key
  68. func (r *RBTree) Search(x *RBNode, k int) *RBNode {
  69. if x == r.null || k == x.key {
  70. return x
  71. } else if k < x.key {
  72. return r.Search(x.left, k)
  73. } else {
  74. return r.Search(x.right, k)
  75. }
  76. }
  77.  
  78. // QuickSearch for a key
  79. func (r *RBTree) QuickSearch(x *RBNode, k int) *RBNode {
  80. for x != r.null && k != x.key {
  81. if k < x.key {
  82. x = x.left
  83. } else {
  84. x = x.right
  85. }
  86. }
  87. return x
  88. }
  89.  
  90. // Min minimum RBNode
  91. func (r *RBTree) Min(x *RBNode) *RBNode {
  92. for x.left != r.null {
  93. x = x.left
  94. }
  95. return x
  96. }
  97.  
  98. // Max maximum RBNode
  99. func (r *RBTree) Max(x *RBNode) *RBNode {
  100. for x.right != r.null {
  101. x = x.right
  102. }
  103. return x
  104. }
  105.  
  106. // Successor previous RBNode
  107. func (r *RBTree) Successor(x *RBNode) *RBNode {
  108. if x.right != r.null {
  109. return r.Min(x.right)
  110. }
  111. y := x.p
  112. for y != r.null && x == y.right {
  113. x, y = y, y.p
  114. }
  115. return y
  116. }
  117.  
  118. // Preccessor post RBNode
  119. func (r *RBTree) Preccessor(x *RBNode) *RBNode {
  120. if x.left != r.null {
  121. return r.Max(x.left)
  122. }
  123. y := x.p
  124. for y != r.null && x == y.left {
  125. x, y = y, y.p
  126. }
  127. return y
  128. }
  129.  
  130. func (r *RBTree) leftRotate(x *RBNode) {
  131. y := x.right
  132. x.right = y.left
  133. if y.left != r.null {
  134. y.left.p = x
  135. }
  136. y.p = x.p
  137. if x.p == r.null {
  138. r.root = y
  139. } else if x == x.p.left {
  140. x.p.left = y
  141. } else {
  142. x.p.right = y
  143. }
  144. y.left = x
  145. x.p = y
  146. }
  147.  
  148. func (r *RBTree) rightRotate(x *RBNode) {
  149. y := x.left
  150. x.left = y.right
  151. if y.right != r.null {
  152. y.left.p = x
  153. }
  154. y.p = x.p
  155. if x.p == r.null {
  156. r.root = y
  157. } else if x == x.p.left {
  158. x.p.left = y
  159. } else {
  160. x.p.right = y
  161. }
  162. y.right = x
  163. x.p = y
  164. }
  165.  
  166. func (r *RBTree) insertFixUp(z *RBNode) {
  167. for z.p.color == red {
  168. if z.p == z.p.p.left {
  169. y := z.p.p.right
  170. if y.color == red {
  171. z.p.color, y.color, z.p.p.color = black, black, red
  172. z = z.p.p
  173. } else {
  174. if z == z.p.right {
  175. z = z.p
  176. r.leftRotate(z)
  177. }
  178. z.p.color, z.p.p.color = black, red
  179. r.rightRotate(z.p.p)
  180. }
  181. } else {
  182. y := z.p.p.left
  183. if y.color == red {
  184. z.p.color, y.color, z.p.p.color = black, black, red
  185. z = z.p.p
  186. } else {
  187. if z == z.p.left {
  188. z = z.p
  189. r.rightRotate(z)
  190. }
  191. z.p.color, z.p.p.color = black, red
  192. r.leftRotate(z.p.p)
  193. }
  194. }
  195. }
  196. r.root.color = black
  197. }
  198.  
  199. // Insert a RBNode
  200. func (r *RBTree) Insert(z *RBNode) {
  201. y, x := r.null, r.root
  202. for x != r.null {
  203. y = x
  204. if z.key < x.key {
  205. x = x.left
  206. } else {
  207. x = x.right
  208. }
  209. }
  210. z.p = y
  211. if y == r.null {
  212. r.root = z
  213. } else if z.key < y.key {
  214. y.left = z
  215. } else {
  216. y.right = z
  217. }
  218. z.left = r.null
  219. z.right = r.null
  220. z.color = red
  221. r.insertFixUp(z)
  222. }
  223.  
  224. func (r *RBTree) transplant(u, v *RBNode) {
  225. if u.p == r.null {
  226. r.root = v
  227. } else if u == u.p.left {
  228. u.p.left = v
  229. } else {
  230. u.p.right = v
  231. }
  232. v.p = u.p
  233. }
  234.  
  235. func (r *RBTree) deleteFixUp(x *RBNode) {
  236. for x != r.root && x.color == black {
  237. if x == x.p.left {
  238. w := x.p.right
  239. if w.color == red {
  240. w.color = black
  241. x.p.color = red
  242. r.leftRotate(x.p)
  243. w = x.p.right
  244. }
  245. if w.left.color == black && w.right.color == black {
  246. w.color = red
  247. x = x.p
  248. } else if w.right.color == black {
  249. w.left.color = black
  250. w.color = red
  251. r.rightRotate(w)
  252. w = x.p.right
  253. }
  254. w.color = x.p.color
  255. x.p.color = black
  256. w.right.color = black
  257. r.leftRotate(x.p)
  258. x = r.root
  259. } else {
  260. w := x.p.left
  261. if w.color == red {
  262. w.color = black
  263. x.p.color = red
  264. r.rightRotate(x.p)
  265. w = x.p.left
  266. }
  267. if w.right.color == black && w.left.color == black {
  268. w.color = red
  269. x = x.p
  270. } else if w.left.color == black {
  271. w.right.color = black
  272. w.color = red
  273. r.leftRotate(w)
  274. w = x.p.left
  275. }
  276. w.color = x.p.color
  277. x.p.color = black
  278. w.left.color = black
  279. r.rightRotate(x.p)
  280. x = r.root
  281. }
  282. }
  283. x.color = black
  284. }
  285.  
  286. // Delete a RBNode
  287. func (r *RBTree) Delete(z *RBNode) {
  288. y, yColor := z, z.color
  289. x := z
  290. if z.left == r.null {
  291. x = z.right
  292. r.transplant(z, z.right)
  293. } else if z.right == r.null {
  294. x = z.left
  295. r.transplant(z, z.left)
  296. } else {
  297. y = r.Min(z.right)
  298. yColor = y.color
  299. x = y.right
  300. if y.p == z {
  301. x.p = y
  302. } else {
  303. r.transplant(y, y.right)
  304. y.right = z.right
  305. y.right.p = y
  306. }
  307. r.transplant(z, y)
  308. y.left = z.left
  309. y.left.p = y
  310. y.color = z.color
  311. }
  312. if yColor == black {
  313. r.deleteFixUp(x)
  314. }
  315. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement