diff --git a/DataStructures/Trees/RedBlack.fs b/DataStructures/Trees/RedBlack.fs index 3946f30..1b41264 100644 --- a/DataStructures/Trees/RedBlack.fs +++ b/DataStructures/Trees/RedBlack.fs @@ -5,5 +5,24 @@ module RedBlack = type Color = Red | Black type RedBlackTree<'T> = - | Node of Color * 'T RedBlackTree * 'T * 'T RedBlackTree - | Leaf \ No newline at end of file + | Node of Color * Left: 'T RedBlackTree * Value: 'T * Right: 'T RedBlackTree + | Leaf + + let balance = function + | Black, Node (Red, Node (Red, a, x, b), y, c), z, d + | Black, Node (Red, a, x, Node (Red, b, y, c)), z, d + | Black, a, x, Node (Red, Node (Red, b, y, c), z, d) + | Black, a, x, Node (Red, b, y, Node (Red, c, z, d)) -> + Node (Red, Node (Black, a, x, b), y, Node (Black, c, z, d)) + | a, b, c, d -> Node (a, b, c, d) + + let insert x s = + let rec loop = function + | Leaf -> Node (Red, Leaf, x, Leaf) + | Node (color, a, y, b) as s -> + if x < y then balance (color, loop a, y, b) + elif y < x then balance (color, a, y, loop b) + else s + + loop s + \ No newline at end of file