Добавление атрибута .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, поскольку его вызовы для поворота влево и вправо уже обновляют размеры. Я прав в этом, или я что-то упускаю? Для меня это звучит логично, но задача говорит мне изменить его так, чтобы поле размера обновлялось, поэтому ответ довольно сбивает с толку, если его не изменить.

0 ответов

Другие вопросы по тегам