mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00

Described in https://github.com/etcd-io/etcd/issues/10877. "black-height" property: Every path from a node to any descendant leaf node must have the same number of black nodes. Expected After deleting 11 (requires rebalancing): [510,511] / \ ---------- -------------------------- / \ [383,384] [830,831] / \ / \ / \ / \ [261,262](red) [410,411] [647,648] [899,900](red) / \ \ / \ / \ \ / \ [82,83] [292,293] [815,816](red) [888,889] [972,973] \ / \ / [238,239](red) [953,954](red) Got After deleting 11 (requires rebalancing): [510,511] / \ ---------- -------------------------- / \ [82,83] [830,831] \ / \ \ / \ [383,384] [647,648] [899,900] / \ \ / \ / \ \ / \ [261,262] [410,411] [815,816] [888,889] [972,973] / \ / / \ / [238,239] [292,293] [953,954] This violates "black-height" property. Signed-off-by: Gyuho Lee <leegyuho@amazon.com>
Red-Black Tree
"Introduction to Algorithms" (Cormen et al, 3rd ed.), Chapter 13
- Every node is either red or black.
- The root is black.
- Every leaf (NIL) is black.
- If a node is red, then both its children are black.
- For each node, all simple paths from the node to descendant leaves contain the same number of black nodes.
For example,
import (
"fmt"
"go.etcd.io/etcd/pkg/adt"
)
func main() {
ivt := adt.NewIntervalTree()
ivt.Insert(NewInt64Interval(510, 511), 0)
ivt.Insert(NewInt64Interval(82, 83), 0)
ivt.Insert(NewInt64Interval(830, 831), 0)
...
After inserting the values 510
, 82
, 830
, 11
, 383
, 647
, 899
, 261
, 410
, 514
, 815
, 888
, 972
, 238
, 292
, 953
.
Deleting the node 514
should not trigger any rebalancing:
Deleting the node 11
triggers multiple rotates for rebalancing:
Try yourself at https://www.cs.usfca.edu/~galles/visualization/RedBlack.html.