Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Технологии разработки объектно-ориентированных программ на язык C++. Представление графических объектов и проектирование программ на алгоритмическом языке C++

.pdf
Скачиваний:
3
Добавлен:
12.11.2023
Размер:
6.1 Mб
Скачать

Напечатаем идеально сбалансированное дерево (рис. 22.47):

cout << "n="; int n;

cin >> n;

Tree<int>* tree = Tree<int>::balancedTree(n); tree->printVTree2();

Рис. 22.47. Вертикальная печать идеально сбалансированного дерева

В файл print.txt записались следующие данные (рис. 22.48).

Рис. 22.48. Данные файла print.txt

61

Лучше ли этот способ вертикальной печати, чем тот, что был представлен в предыдущих подразделах? Условимся называть его вторым, а предыдущий – первым.

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

Выведем дерево, представленное на рис. 22.49.

Рис. 22.49. Пример несбалансированного дерева

Его описывает код листинга ниже. Для того чтобы показать различия в результатах работы первого и второго способов вертикальной печати, они будут реализованы оба (рис. 22.50):

Tree<int>* tree = new Tree<int>(1); tree->insertLeft(2); tree->getLeft()->insertLeft(3); tree->getLeft()->getLeft()->insertLeft(4); tree->getLeft()->insertRight(5); tree->getLeft()->getLeft()->insertRight(6); tree->insertRight(7); tree->getRight()->insertRight(8); tree->getRight()->getRight()->insertLeft(9); tree->getRight()->getRight()->insertRight(1); cout << "Вертикальная печать (1)" << endl; tree->printVTree(1);

cout << "Вертикальная печать (2)" << endl; tree->printVTree2();

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

62

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

Идеально сбалансированное дерево строится так, что только нижний уровень может иметь недостающие элементы, тогда печать будет корректной. Но если не только на нижнем уровне будет не хватать элементов, чтобы заполнить уровень до конца, произойдет смещение элементов: какой-нибудь элемент может оказаться «не на своей строке» при выводе, как можно видеть на рис. 22.49.

Проблема решается пополнением дерева, которое было позаимствовано функцией первого способа вертикальной печати. Этот метод реализованранее представленнойфункциейreplaceNULLforEmpty().

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

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

Достоинство первого способа вертикальной печати в том, что он идентифицирует координаты элементов по формулам, что можно использовать уже не при выводе дерева в консоли, а в отображении дерева, как рисунка. Но всегда нужно пополнять дерево, прежде чем его вывести. Во втором способе, как уже говорилось, пополнение дерева не обязательно, если дерево идеально сбалансированно.

63

ГЛАВА 23. ВВЕДЕНИЕ В ТЕОРИЮ ГРАФОВ

23.1. Виды графов. Терминология теории графов

Графом называется множество узлов и связей между ними. Каждый узел называется вершиной, а каждая связь – ребром. Каждое ребро соединяет две вершины. Графы делятся на ориентиро-

ванные и неориентированные. Ориентированный граф (рис. 23.1) –

такой граф, в котором можно двигаться от вершины к вершине только в одном направлении. Например, можно уехать из Перми в Екатеринбург, а вот из Екатеринбурга в Пермь – нельзя. В неориентированных графах (рис. 23.2) можно двигаться в обе стороны, т.е. из Екатеринбурга можно будет вернуться в Пермь. Вершина графа называется изолированной, если она не имеет связей с другими вершинами.

Рис. 23.1. Ориентированный граф

Рис. 23.2. Неориентированный граф

64

Граф, в котором присутствуют как ориентированные ребра, так и неориентированные, называется смешанным (рис. 23.3).

Рис. 23.3. Смешанный граф

Кроме того, графы делятся на взвешенные и невзвешенные. Граф, в котором каждому ребру в соответствие поставлено некоторое числовое значение – вес, называется взвешенным графом (например, длина дороги). Если никакого числового значения ребрам не поставлено, то граф называется невзвешенным. Чаще всего в названии графа указывают как его ориентированность или неориентированность, так и его взвешенность или невзвешенность

(рис. 23.4).

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

связным (рис. 23.5).

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

Граф с противоположным свойством, имеющий малое число ребер, называется разреженным графом.

Петлей называется ребро, которое соединяет вершины v1 и v2, причем v1 и v2 совпадают. Иными словами, петля – это ребро, которое начинается и заканчивается в одной вершине (рис. 23.7).

65

Рис. 23.4. Взвешенный связный ориентированный граф

Рис. 23.5. Несвязный граф

Рис. 23.6. Плотный граф

Рис. 23.7. Граф с петлей

66

Инцидентность – понятие, используемое только в отношении ребра и вершины. Если v1, v2 – вершины, а e = (v1, v2) – соединяющее их ребро, тогда вершина v1 и ребро e инцидентны, вершина v2 и ребро e тоже инцидентны. Две вершины (или два ребра) инцидентными быть не могут. Например, на рис. 23.3 вершина E инцидентна ребру ET.

Рис. 23.8. Замкнутый маршрут

(вершины 2–3–5–4–3–2)

Смежность – понятие, используемое в отношении только двух ребер либо только двух вершин: два ребра, инцидентные одной вершине, называются смежными; две вершины, инцидентные одному ребру, также называются смежными. Например, на рис. 23.3 вершины А и В смежные, поскольку инциденты одному ребру.

Маршрутом называется такая чередующаяся последователь-

ность вершин и ребер vertex0, edge1, vertex1, edge2, vertex2,….edgek, vertexk, v 0 , e 1 , v 1 , e 2 , v 2 , . . . , e k , v k {\displaystyle v_{0},e_{1},v_{1},e_{2},v_{2},...,e_{k},v_{k}} …..//,

в которой любые два соседних элемента инцидентны. Если v 0 = v k

{\displaystyle v_{0}=v_{k}} vertex0 = vertexk, то маршрут замкнут (рис. 23.8), иначе – открыт (рис. 23.9).

Цепь – маршрут, все ребра которого различны (рис. 23.10). Если все вершины такого маршрута различны, то цепь называется

простой. В цепи vertex0, edge1, ….., edgek, vertexk вершины vertex0

и vertexk называются концами цепи.

Замкнутая цепь называется циклом (рис. 23.11).

67

Рис. 23.9. Открытый маршрут

Рис. 23.10. Открытая цепь

(вершины 2–4–1–2–3–4–1)

(вершины 2–5–1–2–4)

Рис. 23.11. Замкнутая цепь

(вершины 2–4–1–2–3–5–2)

23.2. Представление графов. Матрица смежности

Матрица смежности графа – это квадратная матрица, в которой каждый элемент принимает одно из двух значений: 0 или 1 для невзвешенного графа (рис. 23.12 и 23.13). Значения 1 и 0 отображают существование ребра между вершинами: если между вершинами 1 и 2 есть ребро, то в матрице на пересечении первой строки и второго столбца и второй строки и первого столбца будут стоять единицы. Если граф взвешенный (рис. 23.14), то элементами матрицы смежности будут числа, соответствующие весам ребер, соединяющих вершины, на пересечении которых в таблице стоит элемент.

68

Рис. 23.12. Невзвешенный неориентированный граф

Матрица смежности для графа, изображенного на рис. 23.12, представлена следующим образом:

Номер вершины

1

2

3

4

5

1

0

1

0

0

1

2

1

0

1

1

1

3

0

1

0

1

0

4

0

1

1

0

1

5

1

1

0

1

0

Рис. 23.13. Невзвешенный ориентированный граф

Матрица смежности для графа, изображенного на рис. 23.13, представлена следующим образом:

Номер вершины

1

2

3

4

1

0

1

0

1

2

0

0

1

1

3

0

1

0

0

4

1

0

1

0

69

Рис. 23.14. Взвешенный неориентированный граф

Матрица смежности для графа, изображенного на рис. 23.14, представлена следующим образом:

Номер вершины

1

2

3

4

5

1

0

40

0

0

18

2

40

0

22

6

15

3

0

22

0

14

0

4

0

6

14

0

22

5

18

15

0

20

0

Граф может быть представлен с помощью вектора смежности (рис. 23.15). В векторе смежности для каждой вершины хранятся номера смежных с ней вершин.

Рис. 23.15. Представление графа с помощью вектора смежности

Еще одной формой представления графа является матрица инцидентности, в которой указываются связи между инцидентными элементами графа (ребра и вершины). Столбцы матрицы соответст-

70

Соседние файлы в папке книги