Нахождение правильного предка в 2-3 дерева

Поэтому у меня возникают проблемы с поиском правильного предка в Дереве 2-3. В дереве 2-3 произвольной высоты есть несколько вариантов поиска.

Мои узлы спроектированы следующим образом:

template<typename DataType>
struct node{
   Node<DataType> *child1; //left-child
   Node<DataType> *child2; //middle-child (3-node only)
   Node<DataType> *child3; //right-child
   Node<DataType> *extraChild; //for splitting purposes

   Node<DataType> *parent;

   DataType key1; //key1 <= key2
   DataType key2; //key2 <= extraKey (only when node needs to be split)
   DataType extraKey; //for splitting purposes
};

Есть ли алгоритм или что-то подобное, чтобы найти подходящего предка для узла?

Например, скажем, что мы искали предка H (нижняя часть предоставленного дерева), с визуальной точки зрения очевидно, что предок H - это H в корне дерева. Но для этого нужно перепрыгнуть 4 родительские ссылки. Дерево может иметь произвольный размер, что является проблемой.

Моя цель в конце состоит в том, чтобы создать итератор, который выполняет обход по порядку дерева 2-3. Цель нахождения узла-предка состоит в том, что узел-предок будет последовательным преемником конечного узла, который является правым потомком его родительского узла. Опять же, как в приведенном выше примере.

1 ответ

Если цель состоит в том, чтобы просто пройти 2-3 дерева по порядку, то вам просто нужно написать рекурсивную функцию, которая начинается с корня.

Алгоритм выглядит следующим образом:

traverse(Node n)

    if n.left != null
        traverse(n.left)

    if n.middle != null
        visit(n.key1)
        traverse(n.middle)
        visit(n.key2)
    else
        visit(n.key1)

    if n.right != null
        traverse(n.right)

Алгоритм взят по этой ссылке.

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