Позвольте мне сказать, что существует много разных версий 2-3 деревьев, поэтому это может сбить с толку. На самом деле они отличаются только тем, как хранятся ценности. Некоторые только сохраняют значения в листах и других значениях хранилища в каждом узле.
Я считаю, что ваш учитель использует последнее определение 2-3 деревьев. Таким образом, проблема с вашим деревом - это «корневой» узел имеет те же значения, что и его дочерние элементы, узел никогда не будет делиться теми же значениями, что и его дети. Хотя, я не думаю, что ваш учитель поставил истинное 2-3 дерева. Дерево 2-3 будет разделяться, если узел содержит 3 значения. Я ожидал бы ниже, чтобы быть собственно выход:
Добавить 4 к дереву:
(4)
Добавить 7 к дереву:
(4,7)
Добавить 6 в дерево:
(4,6,7)
*splits*
(6)
(4) (7)
Как только корневой узел получит 3 значения, он разбивается на дерево 1-2.
Если вы должны были вставить 8:
(6)
(4) (7,8)
Если вы должны были вставить 9:
(6)
(4) (7,8,9)
*push-up*
(6,8)
(4) (7) (9)
Когда 3 значения Узла ПОЛУЧИТЬ без корневого; нажимайте среднее значение до родителя, если подталкивать значение, значение имеет значение родительского, имеет 3 значения, затем родитель будет разделяться.
Не правда ли, что родительский узел будет содержать 2 значения: min на левом поддереве и max на среднем поддереве. А у родителя всегда будет только 2 и 3 узла, и не меньше? Так что писать '(7,8)' вместе не бросает вызов концепции? Смущенный! –
@Cruze Что касается вашего первого вопроса, это зависит от конкретной реализации 2-3 дерева, что и помогает ответить на ваш вопрос, чтобы узнать правильный ответ, не зная, чего ожидает ваш учитель. – Justin
@Cruze Если вы посмотрите на эту страницу, она описывает 2-3 дерева, как я объяснил это: http://www.cs.nyu.edu/courses/spring98/V22.0102/btrees.html Но это описывает 2-3 дерева, как вы ожидаете: http://cs.engr.uky.edu/~lewis/essays/algorithms/2-3trees/trees2-3.html – Justin