Изменения

Перейти к: навигация, поиск

Дерево поиска, наивная реализация

2863 байта добавлено, 17:20, 15 января 2017
Восстановление дерева по результату обхода preorderTraversal
Как мы помним, процедура <tex>\mathrm{preorderTraversal}</tex> выводит значения в узлах поддерева следующим образом: сначала идёт до упора влево, затем на каком-то моменте делает шаг вправо и снова движется влево. Это продолжается до тех пор, пока не будут выведены все вершины. Полученная последовательность позволит нам однозначно определить расположение всех узлов поддерева. Первая вершина всегда будет в корне. Затем, пока не будут использованы все значения, будем последовательно подвешивать левых сыновей к последней добавленной вершине, пока не найдём номер, нарушающий убывающую последовательность, а для каждого такого номера будем искать вершину без правого потомка, хранящую наибольшее значение, не превосходящее того, которое хотим поставить, и подвешиваем к ней элемент с таким номером в качестве правого сына.
 
{| style="background-color:#CCC;margin:0.5px"
!style="background-color:#EEE"| Массив
!style="background-color:#EEE"| Описание шага
|-
|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''
|-
|style="background-color:#FFF;padding:2px 10px"| <span style="color:darkviolet">'''5'''</span> 4 <span style="color:black">'''1'''</span> 2 3
|style="background-color:#FFF;padding:2px 10px"| Находим первый минимальный элемент {{---}} '''1'''
|-
|style="background-color:#FFF;padding:2px 10px"| <span style="color:black">'''1'''</span> 4 <span style="color:darkviolet">'''5'''</span> 2 3
|style="background-color:#FFF;padding:2px 10px"| Меняем минимальный и первый элементы местами
|-
|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''
|-
|style="background-color:#FFF;padding:2px 10px"| 1 <span style="color:darkviolet">'''4'''</span> 5 <span style="color:black">'''2'''</span> 3
|style="background-color:#FFF;padding:2px 10px"| Находим следующий минимальный элемент {{---}} '''2'''
|-
|style="background-color:#FFF;padding:2px 10px"| 1 <span style="color:black">'''2'''</span> 5 <span style="color:darkviolet">'''4'''</span> 3
|style="background-color:#FFF;padding:2px 10px"| Меняем минимальный и второй элементы местами
|-
|colspan=3|''Третий проход (текущий массив начинается со следующего элемента)''
|-
|style="background-color:#FFF;padding:2px 10px"| 1 2 <span style="color:darkviolet">'''5'''</span> 4 <span style="color:black">'''3'''</span>
|style="background-color:#FFF;padding:2px 10px"| Находим следующий минимальный элемент {{---}} '''3'''
|-
|style="background-color:#FFF;padding:2px 10px"| 1 2 <span style="color:black">'''3'''</span> 4 <span style="color:darkviolet">'''5'''</span>
|style="background-color:#FFF;padding:2px 10px"| Меняем минимальный и третий элементы местами
|-
|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''
|-
|style="background-color:#FFF;padding:2px 10px"| 1 2 3 <span style="color:black">'''4'''</span> <span style="color:black">5</span>
|style="background-color:#FFF;padding:2px 10px"| Находим следующий минимальный элемент {{---}} '''4'''. Меняем его местами с самим собой.
|-
|style="background-color:#FFF;padding:2px 10px"| 1 2 3 4 5
|style="background-color:#FFF;padding:2px 10px"| Массив отсортирован
|}
 
Разберём алгоритм на примере последовательности для приведённого выше дерева. Она выглядит так: ''8 2 1 4 3 5''. Сначала в корень записывается ''8''. Затем его левым сыном становится вершина с номером ''2'', а её левым сыном — ''1''. Следующее значение — ''4'' — уже нарушает убывающую подпоследовательность. Подберём для него вершину, где лежит значение, меньшее его, причём такая вершина максимальна. В противном случае он будет превосходить и прародителя, находясь в его левом поддереве, а это противоречит определению дерева поиска. Очевидно, что нельзя также подвесить его и к вершине, которая хранить большее значение. Для вершины ''4'' родителем будет узел с числом ''2''. Сделаем его правым сыном рассматриваемую вершину. Затем снова дадим левых потомков последней добавленной вершине, опять же, пока не найдём ключ, нарушающий порядок убывания. В нашем случае в дерево дописывается ''3''. Для следующего значения снова ищем родителя, для которого он станет правым сыном. Это значение равно ''4''. Добавляем ''5'' как правого сына для вершины ''4''. Вершины закончились, мы построили дерево.
243
правки

Навигация