В информатике 2–3-дерево — это древовидная структура данных , в которой каждый узел с потомками ( внутренний узел ) имеет либо двух потомков (2-узел) и один элемент данных , либо трех потомков (3-узел) и два элемента данных. 2–3-дерево — это B-дерево порядка 3. [1] Узлы на внешней стороне дерева ( листовые узлы ) не имеют потомков и имеют один или два элемента данных. [2] [3] 2–3-деревья были изобретены Джоном Хопкрофтом в 1970 году. [4]
Для балансировки требуется 2–3 дерева, что означает, что каждый лист находится на одном уровне. Из этого следует, что каждое правое, центральное и левое поддерево узла содержит одинаковое или близкое к одинаковому количество данных.
Мы говорим, что внутренний узел является 2-узлом, если он имеет один элемент данных и два дочерних элемента.
Мы говорим, что внутренний узел является 3-узлом, если он имеет два элемента данных и три дочерних элемента.
Четырехузел с тремя элементами данных может быть временно создан во время манипуляций с деревом, но никогда не сохраняется в дереве постоянно .
Мы говорим, что T является 2–3-деревом тогда и только тогда, когда выполняется одно из следующих утверждений: [5]
Поиск элемента в дереве 2–3 аналогичен поиску элемента в бинарном дереве поиска . Поскольку элементы данных в каждом узле упорядочены, функция поиска будет направлена на правильное поддерево и в конечном итоге на правильный узел, содержащий элемент.
Вставка сохраняет сбалансированное свойство дерева. [5]
Для вставки в 2-узел новый ключ добавляется к 2-узлу в соответствующем порядке.
Для вставки в 3-узел может потребоваться больше работы в зависимости от расположения 3-узла. Если дерево состоит только из 3-узла, узел разделяется на три 2-узла с соответствующими ключами и потомками.
Если целевой узел — 3-узел, родительский узел — 2-узел, ключ вставляется в 3-узел для создания временного 4-узла. На рисунке ключ 10 вставляется в 2-узел с 6 и 9. Средний ключ — 9, и он продвигается в родительский 2-узел. Это оставляет 3-узел из 6 и 10, который разделяется на два 2-узла, удерживаемых как дочерние элементы родительского 3-узла.
Если целевой узел является 3-узлом, а родительский узел является 3-узлом, создается временный 4-узел, который затем разделяется, как описано выше. Этот процесс продолжается вверх по дереву до корня. Если корень должен быть разделен, то выполняется процесс одного 3-узла: временный 4-узловой корень разделяется на три 2-узла, один из которых считается корнем. Эта операция увеличивает высоту дерева на единицу.
Удаление ключа из нелистового узла можно выполнить, заменив его его непосредственным предшественником или преемником, а затем удалив предшественника или преемника из листового узла. Удаление ключа из листового узла легко, если лист является 3-узлом. В противном случае может потребоваться создание временного 1-узла, который может быть поглощен путем реорганизации дерева, или он может многократно перемещаться вверх, прежде чем его можно будет поглотить, как это может сделать временный 4-узел в случае вставки. В качестве альтернативы можно использовать алгоритм, который является как сверху вниз, так и снизу вверх, создавая временные 4-узла на пути вниз, которые затем уничтожаются при обратном движении вверх. Методы удаления более подробно описаны в ссылках. [5] [6]
Поскольку 2–3 деревья по своей структуре похожи на красно-черные деревья , параллельные алгоритмы для красно-черных деревьев можно применять и к 2–3 деревьям.
, определенные в конце раздела 6.2.3, эквивалентны B-деревьям порядка 3.