Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ekz_informat (1).docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
223.77 Кб
Скачать

Вопрос 20. Двоичные деревья. Алгоритмы обхода узлов двоичного дерева.

Двоичное дерево - либо пустое множество элементов, либо множество состоящее из одного элемента, которое называется корнем двоичного дерева, либо множество элементов, которое состоит из корня двоичного дерева и одного или двух не пересекающихся подмножеств, каждое из которых является двоичным деревом.

Работа с элементами двоичного дерева является нетривиальной задачей и требует использование рекурсии.

Существует три алгоритма обхода узлов двоичного дерева (элементов)

Алгоритм обхода узлов двоичного дерева в префиксном порядке

Шаг 1. Найти корень двоичного дерева и выполнить необходимую операцию (например, напечатать этот корень)

Шаг 2. Пройти левое поддерево в префиксном порядке(рекурсия)

Шаг 3. Пройти правое поддерево в префиксном порядке.

Шаг 4. Закончить работу алгоритма.

Алгоритм обхода узлов двоичного дерева в инфиксном порядке.

Шаг 1. Найти корень двоичного дерева.

Шаг 2. Пройти левое поддерево в инфиксном порядке.

Шаг 3. Выполнить требуемую операцию над корнем двоичного дерева(например, напечатать этот корень).

Шаг 4. Пройти Право поддерево в инфиксном порядке.

Шаг 5. Закончить работу алгоритма.

Алгоритм обхода узлов двоичного дерева в постфиксном порядке.

Шаг 1. Найти корень двоичного дерева.

Шаг 2. Пройти левое поддерево в постфиксном порядке.

Шаг 3. Пройти правое поддерево в постфиксном порядке.

Шаг 4. Выполнить требуемую операцию над корнем двоичного дерева (например, напечатать этот корень).

Шаг 5. Закончить работу алгоритма.

Private Sub click()

Dim n As Integer, i As Integer, tt As Integer, L() As Integer, R() As Integer, T() As String, S As String

S=” “:n=cells(1,4):ReDim L(n), R(n), T(n)

For i=1 To n

L(i)=cells(i,1):T(i)=cells(i,2):R(i)=cells(i,3)

Next i

Call tree_walk(1,L(),T(),R(),S)

MsgBox S, “~~~…ксный порядок~~~”

End Sub

Sub tree_walk(tt As Integer, L() As Integer, T() As String, R() As Integer, S As String)

If tt=0 Then Exit Sub ‘S=S+T(tt)+chr$(12)

Call tree_walk(L(tt), L(), T(), R(), S) ‘Левое S=S+T(tt)+chr$(13) Префиксный порядок

Call tree_walk(R(tt), L(), T(), R(), S) ‘Право S=S+T(tt)+chr$(13) Инфиксный порядок

End Sub

tt- Указатель на вершину дерева. Если дерево пусто, то tt=0 => алгоритм надо останавливать.

L()- массив с указателями на левого сына.

R()- массив с указателями на правого сына.

T()- массив для хранения самих элементов дерева

S- итоговая фраза (строковая переменная)

Найти, что выдаёт программа в инфиксном и постфиксном порядках.

Вопрос 21. Графы. Алгоритм поиска достижимых вершин графа.

Графы-способ формализовать всевозможные схемы.

Математики считают, что граф состоит из двух связанных между собой множеств. Первое-множество вершин (чаще всего изображается в виде кружочков с цифрами). Вершина: технологическая установка города на атласе автомобильных дорог, станция метрополитена и т.д.

Второе-множество дуг (чаще всего изображается в виде стрелочек).

Дуга: трубы, дороги, туннели.

Графы бывают направленные и ненаправленные. Если граф направленный, дуги обозначаются стрелочками (транспортная схема с односторонним движением).

Один из способов представления графа в памяти компьютера называется матрицей смежности.

Задача: граф задан матрицей смежности; необходимо назвать все вершины графа, в которые можно попасть по стрелочкам (дугам) из заданной вершины.

Схематичное описание алгоритма поиска достижимых вершин.

Алгоритм поиска достижимых вершин графа является рекурсивным. Схематично его можно описать как:

Шаг 1: найти все вершины непосредственно связанные со стартовой вершиной (идём по стрелочкам);

Шаг 2(рекурсивный): для каждой найденной вершины рекурсивно выполнить алгоритм поиска достижимых вершин, рассматривая уже найденную вершину как стартовую.

В процессе работы все найденные вершины нужно объединять вместе.

Примитивный алгоритм должен быть снабжён проверками, предотвращающий бесконечную рекурсию.

←Бесконечная рекурсия.

Sub click()

Dim n As Integer, i As Integer, j As Integer, count As Integer

n=cells(2,1) ‘ n – это количество вершин (ячеек)

ReDim A(n,h) As Integer ‘ двумерный массив А

F or i=1 To n:for j=1 To n двойной цикл перебираются строки , столбцы , ячейки

A(i,j)=cells(1+i,2+j)

Next j,i

i=cells(2,2):count=0 ‘ счётчик считает найденные вершины начиная с 0

call spisok(n,i,count,A()) ‘ i – стартовая величина , Call – вызов подпрограммы , А( ) –матрица смежности .

End Sub

Подпрограмма (процедура), вызывает сама себя, (рекурсивная ):

Sub spisok (n As Integer, i_start As Integer, count As Integer, A() As Integer)

Dim i As Integer, j As Integer, k As Integer ‘ дополнительные переменные

For j=1 to n

If A(i_start,j)=1 then

count=count+1’увеличивает счётчик на единицу

cells(3+count,2)=j ‘ записывает в свободную ячейку

For k=1 To n:A(k,j)=-Abs(A(k,j)):Next k ‘Отвечает за то, чтобы мы не могли попасть в найденную вершину из другой вершины

call spisok (n,j,count,A()) ‘ программа вызывает сама себя , i- стартовая величина ,не исходная ,а которую мы нашли

End If

Next j

End Sub

f or k=1 To n:A(k,j)=-Abs(A(k,j)):Next k

1 соответствует разорванной стрелке => больше в найденную вершину не попадём.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]