Добавление атрибута .size к узлам красно-черного бинарного дерева (псевдокод)
В моем классе CS мне дали задание добавить атрибут размера к узлам в красно-черном двоичном дереве. Размер узла — это количество узлов в его поддеревьях. Этот атрибут необходимо обновлять при внесении изменений в дерево RB, в частности, в алгоритме поворота влево, алгоритме вставки и алгоритме исправления вставки. Эти 3 алгоритма взяты из CLRS и представляют собой псевдокод.
Сначала я изменил алгоритм поворота влево, чтобы обновить размер измененных узлов. T — дерево, x — узел для вращения.
ПОВОРОТ ВЛЕВО(T,x)
y = x.right
x.right = y.left
if y.left != T.nil:
y.left.p = x
y.p = x.p
if x.p == T.nil
T.root = y
else if x == x.p.left
x.p.left = y
else
x.p.right = y
y.left = x
x.p = y
x.size = x.left.size + x.right.size
y.size = y.left.size + y.right.size
Последние две строки я добавил сам, что обновляет размер.
Далее идет Insert, где T — дерево, а z — вставляемый узел:RB-INSERT(T,z)
y = T.nil
x = T.root
while x != T.nil
y = x
if z.key < x.key
x = x.left
else
x = x.right
y.size++
z.p = y
if y == T.nil
T.root = z
else if z.key > y.key
y.left = z
else y.right = z
z.left = T.nil
z.right = T.nil
z.color = RED
RB-INSERT-FIXUP(T,z)
Довольно простое исправление, я просто вставил y.size++ в конец цикла while, так как каждый раз, когда мы спускаемся вниз по дереву, мы обновляем размер родителей.
Теперь вот моя текущая проблема, обновление размера в алгоритме RB-INSERT-FIXUP. Я еще не добавлял код, но вот алгоритм для изменения:
RB-INSERT-FIXUP(T,z)
while z.p.color == RED
if z.p == z.p.p.left
y = z.p.p.right
if y.color = RED
z.p.color = BLACK
y.color = BLACK
z.p.p.color = RED
z = z.p.p
else if z == z.p.right
z = z.p
LEFT-ROTATE(T,z)
z.p.color = BLACK
z.p.p.color = RED
RIGHT-ROTATE(T,z.p.p)
else(Same as then clase with "right and "left" exchanged)
T.root.color = BLACK
Предположим, что в INSERT-FIXUP команды LEFT-ROTATE и RIGHT-ROTATE также обновляют размеры в своих собственных алгоритмах.
Поэтому мне нужно обновить размер соответствующих узлов, которые перемещаются в INSERT-FIXUP. Я не уверен, как это сделать. Из того, что я понимаю, даже не нужно обновлять размеры в FIXUP, поскольку его вызовы для поворота влево и вправо уже обновляют размеры. Я прав в этом, или я что-то упускаю? Для меня это звучит логично, но задача говорит мне изменить его так, чтобы поле размера обновлялось, поэтому ответ довольно сбивает с толку, если его не изменить.