(node *RBNode[T], key T)
| 298 | } |
| 299 | |
| 300 | func (t *RB[T]) deleteHelper(node *RBNode[T], key T) bool { |
| 301 | z := t._NIL |
| 302 | for node != t._NIL { |
| 303 | switch { |
| 304 | case node.key == key: |
| 305 | z = node |
| 306 | fallthrough |
| 307 | case node.key <= key: |
| 308 | node = node.right |
| 309 | case node.key > key: |
| 310 | node = node.left |
| 311 | } |
| 312 | } |
| 313 | |
| 314 | if z == t._NIL { |
| 315 | return false |
| 316 | } |
| 317 | |
| 318 | var x *RBNode[T] |
| 319 | y := z |
| 320 | yOriginColor := y.color |
| 321 | if z.left == t._NIL { |
| 322 | x = z.right |
| 323 | t.transplant(z, z.right) |
| 324 | } else if z.right == t._NIL { |
| 325 | x = z.left |
| 326 | t.transplant(z, z.left) |
| 327 | } else { |
| 328 | y = minimum[T](z.right, t._NIL).(*RBNode[T]) |
| 329 | yOriginColor = y.color |
| 330 | x = y.right |
| 331 | if y.parent == z { |
| 332 | x.parent = y |
| 333 | } else { |
| 334 | t.transplant(y, y.right) |
| 335 | y.right = z.right |
| 336 | y.right.parent = y |
| 337 | } |
| 338 | |
| 339 | t.transplant(z, y) |
| 340 | y.left = z.left |
| 341 | y.left.parent = y |
| 342 | y.color = z.color |
| 343 | } |
| 344 | |
| 345 | if yOriginColor == Black { |
| 346 | t.deleteFix(x) |
| 347 | } |
| 348 | |
| 349 | return true |
| 350 | } |
| 351 | |
| 352 | func (t *RB[T]) deleteFix(x *RBNode[T]) { |
| 353 | var s *RBNode[T] |
no test coverage detected