<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.207.178.183&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.207.178.183&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/178.207.178.183"/>
		<updated>2026-04-14T19:04:00Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=2-3_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&amp;diff=80791</id>
		<title>2-3 дерево</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=2-3_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&amp;diff=80791"/>
				<updated>2021-04-14T12:41:52Z</updated>
		
		<summary type="html">&lt;p&gt;178.207.178.183: /* Свойства */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:23treemain.png|400px|Пример 2-3 дерева|thumb]]''' 2-3 дерево '''(англ. ''2-3 tree'') — структура данных, представляющая собой сбалансированное дерево поиска, такое что из каждого узла может выходить две или три ветви и глубина всех листьев одинакова. Является частным случаем [[B-дерево#B.2B-.D0.B4.D0.B5.D1.80.D0.B5.D0.B2.D0.BE|B+ дерева]].&lt;br /&gt;
== Свойства ==&lt;br /&gt;
2-3 дерево {{---}} сбалансированное дерево поиска, обладающее следующими свойствами:&lt;br /&gt;
*нелистовые вершины имеют либо &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;, либо &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; сына,&lt;br /&gt;
*нелистовая вершина, имеющая двух сыновей, хранит максимум левого поддерева. Нелистовая вершина, имеющая трех сыновей, хранит два значения. Первое значение хранит максимум левого поддерева, второе максимум центрального поддерева,&lt;br /&gt;
*сыновья упорядочены по значению максимума поддерева сына,&lt;br /&gt;
*все листья лежат на одной глубине,&lt;br /&gt;
*высота 2-3 дерева &amp;lt;tex&amp;gt;O(\log{n})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; {{---}} количество элементов в дереве.&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
Введем следующие обозначения:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{root}&amp;lt;/tex&amp;gt; {{---}} корень 2-3 дерева.&lt;br /&gt;
Каждый узел дерева обладает полями:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{parent}&amp;lt;/tex&amp;gt; {{---}} родитель узла,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{sons}&amp;lt;/tex&amp;gt; {{---}} сыновья узла, &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{keys}&amp;lt;/tex&amp;gt; {{---}} ключи узла, &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{length}&amp;lt;/tex&amp;gt; {{---}} количество сыновей.&lt;br /&gt;
=== Поиск ===&lt;br /&gt;
*&amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; {{---}} искомое значение,&lt;br /&gt;
*&amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; {{---}} текущая вершина в дереве. &lt;br /&gt;
&lt;br /&gt;
Изначально &amp;lt;tex&amp;gt;t = \mathtt{root}&amp;lt;/tex&amp;gt;. Будем просматривать ключи в узлах, пока узел не является листом. Рассмотрим два случая:&lt;br /&gt;
*у текущей вершины два сына. Если её значение меньше &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;t = \mathtt{t.sons[1]}&amp;lt;/tex&amp;gt;, иначе &amp;lt;tex&amp;gt;t = \mathtt{t.sons[0]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*у текущей вершины три сына. Если второе значение меньше &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;t = \mathtt{t.sons[2]}&amp;lt;/tex&amp;gt;. Если первое значение меньше &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;t = \mathtt{t.sons[1]}&amp;lt;/tex&amp;gt;, иначе &amp;lt;tex&amp;gt;t = \mathtt{t.sons[0]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''T''' search('''T''' x):&lt;br /&gt;
   Node t = root&lt;br /&gt;
   '''while''' (t не является листом)&lt;br /&gt;
     '''if''' (t.length == 2)&lt;br /&gt;
       '''if''' (t.keys[0] &amp;lt; x)&lt;br /&gt;
         t = t.sons[1]&lt;br /&gt;
       '''else''' &lt;br /&gt;
         t = t.sons[0]&lt;br /&gt;
     '''else''' '''if''' (t.keys[1] &amp;lt; x)&lt;br /&gt;
       t = t.sons[2]&lt;br /&gt;
     '''else''' '''if''' (t.keys[0] &amp;lt; x)&lt;br /&gt;
       t = t.sons[1]&lt;br /&gt;
     '''else''' &lt;br /&gt;
       t = t.sons[0]&lt;br /&gt;
   '''return''' t.keys[0]&lt;br /&gt;
&lt;br /&gt;
[[Файл:23treesearch.png|thumb|center|600px|Поиск элемента 19, оранжевые стрелки обозначают путь по дереву при поиске]]&lt;br /&gt;
&lt;br /&gt;
=== Вставка элемента ===&lt;br /&gt;
*&amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; {{---}} добавляемое значение,&lt;br /&gt;
*&amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; {{---}} текущая вершина в дереве. Изначально &amp;lt;tex&amp;gt;t = \mathtt{root}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Если корня не существует {{---}} дерево пустое, то новый элемент и будет корнем (одновременно и листом). Иначе поступим следующим образом:&lt;br /&gt;
&lt;br /&gt;
Найдем сперва, где бы находился элемент, применив &amp;lt;tex&amp;gt;\mathtt{search(x)}&amp;lt;/tex&amp;gt;. Далее проверим есть ли у этого узла родитель, если его нет, то в дереве всего один элемент {{---}} лист. Возьмем этот лист и новый узел, и создадим для них родителя, лист и новый узел расположим в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
Если родитель существует, то подвесим к нему ещё одного сына. Если сыновей стало &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;, то разделим родителя на два узла, и повторим разделение теперь для его родителя, ведь у него тоже могло быть уже &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; сына, а мы разделили и у него стало на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; сына больше. (перед разделением обновим ключи).&lt;br /&gt;
&lt;br /&gt;
 '''function''' splitParent('''Node''' t):&lt;br /&gt;
  '''if''' (t.length &amp;gt; 3) &lt;br /&gt;
    Node a = Node(sons = {t.sons[2], t.sons[3]}, keys = {t.keys[2]}, parent = t.parent, length = 2)&lt;br /&gt;
    t.sons[2].parent = a&lt;br /&gt;
    t.sons[3].parent = a&lt;br /&gt;
    t.length = 2&lt;br /&gt;
    t.sons[2] = ''null''&lt;br /&gt;
    t.sons[3] = ''null''&lt;br /&gt;
    '''if''' (t.parent != ''null'')&lt;br /&gt;
      t.parent[t.length] = a&lt;br /&gt;
      t.length++&lt;br /&gt;
      сортируем сыновей у t.parent&lt;br /&gt;
      splitParent(t.parent)&lt;br /&gt;
    '''else'''                   &amp;lt;font color=green&amp;gt;// мы расщепили корень, надо подвесить его к общему родителю, который будет новым корнем&amp;lt;/font&amp;gt;&lt;br /&gt;
     Node t = root&lt;br /&gt;
     root.sons[0] = t&lt;br /&gt;
     root.sons[1] = a&lt;br /&gt;
     t.parent = root&lt;br /&gt;
     a.parent = root&lt;br /&gt;
     root.length = 2&lt;br /&gt;
     сортируем сыновей у root&lt;br /&gt;
Если сыновей стало &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, то ничего не делаем. Далее необходимо восстановить ключи на пути от новой вершины до корня:&lt;br /&gt;
 '''function''' updateKeys('''Node''' t): &lt;br /&gt;
   Node a = t.parent&lt;br /&gt;
   '''while''' (a != ''null'')&lt;br /&gt;
    '''for''' i = 0 .. a.length - 1&lt;br /&gt;
      a.keys[i] = max(a.sons[i]) &amp;lt;font color=green&amp;gt;// max {{---}} возвращает максимальное значение в поддереве.&amp;lt;/font&amp;gt;&lt;br /&gt;
    a = a.parent                 &amp;lt;font color=green&amp;gt;// Примечание: max легко находить, если хранить максимум &amp;lt;/font&amp;gt;&lt;br /&gt;
                                 &amp;lt;font color=green&amp;gt;// правого поддерева в каждом узле {{---}} это значение и будет max(a.sons[i])&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathtt{updateKeys}&amp;lt;/tex&amp;gt; необходимо запускать от нового узла.&lt;br /&gt;
Добавление элемента:&lt;br /&gt;
 '''function''' insert('''T''' x):&lt;br /&gt;
   Node n = Node(x)&lt;br /&gt;
   '''if''' (root == ''null'') &lt;br /&gt;
    root = n&lt;br /&gt;
    '''return'''&lt;br /&gt;
   Node a = searchNode(x)     &lt;br /&gt;
   '''if''' (a.parent == ''null'') &lt;br /&gt;
     Node t = root&lt;br /&gt;
     root.sons[0] = t&lt;br /&gt;
     root.sons[1] = n&lt;br /&gt;
     t.parent = root&lt;br /&gt;
     n.parent = root&lt;br /&gt;
     root.length = 2&lt;br /&gt;
     сортируем сыновей у root&lt;br /&gt;
   '''else''' &lt;br /&gt;
     Node p = a.parent&lt;br /&gt;
     p.sons[p.length] = n&lt;br /&gt;
     p.length++&lt;br /&gt;
     n.parent = p&lt;br /&gt;
     сортируем сыновей у p&lt;br /&gt;
     updateKeys(n) &lt;br /&gt;
     split(n)&lt;br /&gt;
   updateKeys(n) &lt;br /&gt;
Так как мы спускаемся один раз, и поднимаемся вверх при расщеплении родителей не более одного раза, то &amp;lt;tex&amp;gt;\mathtt{insert}&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(\log{n})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Примеры добавления:&lt;br /&gt;
&lt;br /&gt;
[[Файл:23treeinsert.png|thumb|center|Добавление элемента с ключом 6|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Удаление элемента ===&lt;br /&gt;
*&amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; {{---}} значение удаляемого узла,&lt;br /&gt;
*&amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; {{---}} текущий узел,&lt;br /&gt;
*&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} брат &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; {{---}} отец &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; {{---}} соседний брат &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;gp&amp;lt;/tex&amp;gt; {{---}} отец &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть изначально &amp;lt;tex&amp;gt;t = \mathtt{searchNode(x)}&amp;lt;/tex&amp;gt; {{---}} узел, где находится &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если у &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; не существует родителя, то это корень (одновременно и единственный элемент в дереве). Удалим его.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; существует, и у него строго больше &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; сыновей, то просто удалим &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, а у &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; уменьшим количество детей.&lt;br /&gt;
&lt;br /&gt;
Если у родителя &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; два сына, рассмотрим возможные случаи (сперва везде удаляем &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;):&lt;br /&gt;
*&amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; не существует, тогда мы удаляем одного из сыновей корня, следовательно, другой сын становится новым корнем,&lt;br /&gt;
*у &amp;lt;tex&amp;gt;gp&amp;lt;/tex&amp;gt; оказалось &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; сына, у &amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; оказалось &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; сына. Подвесим &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; и удалим &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;. Так как у &amp;lt;tex&amp;gt;gp&amp;lt;/tex&amp;gt; {{---}} родителя &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, оказалось тоже два сына, повторяем для &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; такие же рассуждения,&lt;br /&gt;
*у &amp;lt;tex&amp;gt;gp&amp;lt;/tex&amp;gt; оказалось &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; сына, у &amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; оказалось &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; сына. Просто заберем ближайшего к нам сына у &amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; и прицепим его к &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;. Восстановим порядок в сыновьях &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;. Теперь у &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; оказалось снова два сына и все узлы 2-3 дерева корректны,&lt;br /&gt;
*у &amp;lt;tex&amp;gt;gp&amp;lt;/tex&amp;gt; оказалось &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; сына, у &amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; оказалось &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; сына. Подвесим &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; и удалим &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, а у &amp;lt;tex&amp;gt;gp&amp;lt;/tex&amp;gt; уменьшим количество детей. Так как у &amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; оказалось три сына, а у &amp;lt;tex&amp;gt;gp&amp;lt;/tex&amp;gt; все ещё больше одного сына, то все узлы 2-3 дерева корректны.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщим алгоритм при удалении когда у родителя &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; два сына:&lt;br /&gt;
*Если &amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; не существует, то оказывается, что мы сейчас удаляем какого-то из сыновей корня (для определенности далее левого, с правым аналогично). Тогда теперь правый сын становится корнем. На этом удаление заканчивается.&lt;br /&gt;
&lt;br /&gt;
*Если &amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; существует, то удалим &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, а его брата (&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;) перецепим к &amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt;. Теперь у &amp;lt;tex&amp;gt;np&amp;lt;/tex&amp;gt; могло оказаться &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; сына, поэтому повторим аналогичные действия из &amp;lt;tex&amp;gt;\mathtt{insert}&amp;lt;/tex&amp;gt;: вызовем &amp;lt;tex&amp;gt;\mathtt{updateKeys}(b)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathtt{splitParent}(np)&amp;lt;/tex&amp;gt;. Теперь рекурсивно удалим &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В результате мы получаем корректное по структуре 2-3 дерево, но у нас есть нарушение в ключах в узлах, исправим их с помощью &amp;lt;tex&amp;gt;\mathtt{updateKeys()}&amp;lt;/tex&amp;gt;, запустившись от &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл:23treedelete.png|thumb|center|Удаление элемента с ключом 2|1150px]]&lt;br /&gt;
&lt;br /&gt;
=== Следующий и предыдущий ===&lt;br /&gt;
*&amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; {{---}} поисковый параметр,&lt;br /&gt;
*&amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; {{---}} текущий узел.&lt;br /&gt;
В силу того, что наши узлы отсортированы по максимуму в поддереве, то следующий объект {{---}} это соседний лист справа. Попасть туда можно следующим образом:&lt;br /&gt;
будем подниматься вверх, пока у нас не появится первой возможности свернуть направо вниз. Как только мы свернули направо вниз, будем идти всегда влево. Таким образом, мы окажемся в соседнем листе. Если мы не смогли ни разу свернуть направо вниз, и пришли в корень, то следующего объекта не существует. Случай с предыдущим симметричен.&lt;br /&gt;
  '''T''' next('''T''' x):&lt;br /&gt;
    Node t = searchNode(x)&lt;br /&gt;
    '''if''' (t.keys[0] &amp;gt; x) &amp;lt;font color=green&amp;gt; //x не было в дереве, и мы нашли следующий сразу&amp;lt;/font&amp;gt;&lt;br /&gt;
      '''return''' t.keys[0]&lt;br /&gt;
    '''while''' (t != ''null'')&lt;br /&gt;
      t = t.parent&lt;br /&gt;
      '''if''' (можно свернуть направо вниз)&lt;br /&gt;
       в t помещаем вершину, в которую свернули&lt;br /&gt;
       '''while''' (пока t {{---}} не лист)&lt;br /&gt;
        t = t.sons[0]&lt;br /&gt;
      '''return''' t&lt;br /&gt;
    '''return''' t.keys[0]&lt;br /&gt;
     &lt;br /&gt;
&lt;br /&gt;
[[Файл:23treenext.png|thumb|center|400px|Путь при поиске следующего элемента после 2]]&lt;br /&gt;
&lt;br /&gt;
=== Нахождение m следующих элементов ===&lt;br /&gt;
B+ деревья, поддерживают операцию &amp;lt;tex&amp;gt;\mathtt{find}&amp;lt;/tex&amp;gt;, которая позволяет находить m следующих элементов. Наивная реализация выглядит следующим образом: будем вызывать &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; раз поиск следующего элемента, такое решение работает за &amp;lt;tex&amp;gt;O(m  \log{n})&amp;lt;/tex&amp;gt;. Но 2-3 деревья, позволяют находить m следующих элементов за &amp;lt;tex&amp;gt;O(m + \log{n})&amp;lt;/tex&amp;gt;, что значительно ускоряет поиск при больших &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
По построению, все листья у нас отсортированы в порядке возрастания, воспользуемся этим для нахождения m элементов. Нам необходимо связать листья, для этого модифицируем&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathtt{insert}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathtt{delete}&amp;lt;/tex&amp;gt;. Добавим к узлам следующие поля:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{right}&amp;lt;/tex&amp;gt; {{---}} указывает на правый лист,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{left}&amp;lt;/tex&amp;gt; {{---}} указывает на левый лист.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; {{---}} добавленный узел.&lt;br /&gt;
Изменим &amp;lt;tex&amp;gt;\mathtt{insert}&amp;lt;/tex&amp;gt; следующим образом: в самом конце, после того как мы уже обновили все ключи, найдем &amp;lt;tex&amp;gt;\mathtt{next(t)}&amp;lt;/tex&amp;gt; и запишем ссылку на него в &amp;lt;tex&amp;gt;\mathtt{t.right}&amp;lt;/tex&amp;gt;. Аналогично с левым.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; {{---}} удаляемый узел. Изменим &amp;lt;tex&amp;gt;\mathtt{delete}&amp;lt;/tex&amp;gt; следующим образом: в самом начале, до удаления &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, найдем следующий &amp;lt;tex&amp;gt;\mathtt{next}&amp;lt;/tex&amp;gt; и запишем в &amp;lt;tex&amp;gt;\mathtt{next.left}&amp;lt;/tex&amp;gt; правый лист относительно &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. С левым поступим аналогично.&lt;br /&gt;
&lt;br /&gt;
В итоге, мы имеем двусвязный список в листьях, и чтобы нам вывести &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; элементов, нам достаточно один раз найти нужный элемент и пробежаться вправо на &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; элементов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:23treefindm.png|thumb|Изменение ссылок при добавлении нового элемента|thumb|center|800px]]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[B-дерево]]&lt;br /&gt;
* [[Splay-дерево]]&lt;br /&gt;
* [[АВЛ-дерево]]&lt;br /&gt;
* [[Декартово дерево]]&lt;br /&gt;
* [[Красно-черное дерево]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://is.ifmo.ru/vis/tree23/tree23_ru.html is.ifmo.ru {{---}} Визуализатор 2-3 дерева]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/trees/2-3-2002 rain.ifmo.ru {{---}} Визуализатор 2-3 дерева]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/2-3-дерево Википедия {{---}} 2-3 дерево]&lt;br /&gt;
* Д. Кнут «Искусство программирования. Сортировка и поиск» {{---}} стр. 508-509&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Структуры данных]]&lt;br /&gt;
[[Категория:Деревья поиска]]&lt;/div&gt;</summary>
		<author><name>178.207.178.183</name></author>	</entry>

	</feed>