Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Третьяков А. С. Алгоритмы и структуры данных.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

4.5.3 Удаление узлов

Также как и вставку узла, его удаление удобно задать рекурсивно. Пусть x – удаляемый узел, тогда если x – лист (терминальный узел), то алгоритм удаления сводиться к простому исключению узла x, и подъему к корню с переопределением balance factor’ов узлов. Если же x не является листом, то он либо имеет правое поддерево, либо не имеет его. Во втором случае, из свойства АВЛ-дерева, следует, что левое поддерево имеет высоту 1, и здесь алгоритм удаления сводиться к тем же действиям, что и при терминальном узле. Остается ситуация когда у x есть правое поддерево. В таком случае нужно в правом поддереве отыскать следующий по значению за x узел y, заменить x на y, и рекурсивно вернуться к корню, переопределяя коэффициенты сбалансированности узлов. Из свойства двоичного дерева поиска следует, что узел y имеет наименьшее значение среди всех узлов правого поддерева узла x.

Для программной реализации операции удаления узла опишем функцию Delete:

Node *Delete(Node *x, int k)

{

if (!x) return 0;

if (k<x->key) x->left=Delete(x->left, k);

else if (k>x->key) x->right=Delete(x->right, k);

else

{

Node *y=x->left;

Node *z=x->right;

delete x;

if (!z) return y;

Node* min=SearchMin(z);

min->right=DeleteMin(z);

min->left=y;

return Balance(min);

}

return Balance(x);

}

Из нее вызываются вспомогательные функции: SearchMin и DeleteMin. Первая ищет минимальный элемент в правом поддереве, вторая удаляет его. Опишем эти вспомогательные функции:

Node *SearchMin(Node *x)

{

if (x->left) return SearchMin(x->left);

else return x;

}

Node *DeleteMin(Node *x)

{

if (x->left==0) return x->right;

x->left=DeleteMin(x->left);

return Balance(x);

}

Операция удаления реализуется определенно сложнее, чем операция добавления. Да и последствия ее выполнения могут потребовать поворота в каждом узле. Но какова вероятность возникновения ситуации, при которой появится потребность в поворотах? Этим вопросом задается Никлаус Вирт в своей книге «Алгоритмы и структуры», и отвечает на него: «Удивительный результат эмпирических проверок показал, что в то время как один поворот вызывается приблизительно каждыми двумя включениями, тем не менее, при удалении мы имеем дело с одним поворотом на целых пять удалений».

Раздел II алгоритмы

Введение

Понятие алгоритма – одно из базовых в информатике и главное в программировании. Алгоритм – это совокупность инструкций исполнителю, выполнять конечную последовательность действий для достижения решения им задачи за конечное число шагов. Под исполнителем, чаще всего, понимается некоторый механизм (компьютер, станок), способный понимать и выполнять те или иные команды. Но в качестве исполнителя может выступать, например, человек или животное, т. к. алгоритм это не обязательно сложные, понятные лишь компьютеру инструкции. Действие схожее с приготовлением пищи или походом в магазин также является алгоритмом.

Слово «алгоритм» происходит от имени средневекового персидского ученого Абу Абдуллах Мухаммеда ибн Муса аль-Хорезми (алгоритм – аль-Хорезми). Оно впервые упоминается в его сочинении, датированным примерно 825-ым годом.

Алгоритм должен быть описан согласно некоторым правилам. Различают следующие способы описания алгоритма:

  • словесное описание (с помощью естественного языка);

  • графическое описание (с помощью блок-схем);

  • программное описание (с помощью языка программирования);

  • псевдокод (словесное описание + программное описание).

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

  • линейный алгоритм – набор инструкций, выполняемых последовательно во времени друг за другом;

  • разветвляющийся алгоритм – алгоритм, в котором направление обработки информации зависит от результата выполнения логического условия;

  • циклический алгоритм – алгоритм, предусматривающий многократное повторение одного и того же действия над исходными данными.

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

  • дискретность – процесс решения задачи алгоритм должен представляться как последовательное выполнение некоторых простых шагов;

  • детерминированность – выдача алгоритмом одного и того же результата для одних и тех же исходных данных;

  • понятность – использование только понятных исполнителю команд;

  • конечность – завершенность работы алгоритма и выдача им результата за конечное число шагов;

  • универсальность (массовость) – возможность применения алгоритма к разным наборам исходных данных;

  • результативность – завершение алгоритма определёнными результатами.