Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[69]

ном участке памяти. Рассмотрим реализацию списка с помощью нескольких массивов. Перепишите процедуры Allocate-Object и Free-Object таким образом, чтобы элементы списка занимали позиции 1.. то, где то - число элементов списка. (Указание: воспользуйтесь реализацией стека на базе массива.)

11.3-5 Пусть двусторонне связанный список L длины то представлен с помощью трех массивов key, prev и next длины п, а процедуры выделения и освобождения места поддерживают двусторонне связанный список свободных позиций.

Напишите процедуру Compactify-List (сжатие списка), которая переписывает список L длины то в первые то позиций массивов, сохраняя его структуру (и изменяя список свободных позиций нужным образом). Время работы алгоритма должно быть О (то), размер используемой памяти (сверх занятой массивами) должен быть 0(1). Не забудьте доказать правильность своего алгоритма.

11.4. Представление корневых деревьев

Описанные в предыдущем разделе способы представления списков применимы и к другим структурам данных, составленным из однотипных элементов. В этом разделе мы научимся использовать указатели для представления деревьев. Начнём мы с двоичных деревьев, а затем объясним, как представлять деревья с произвольным ветвлением.

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

Двоичные деревья

Как показано на рис. 11.9, при представлении двоичного дерева Г мы используем поля р, left и right, в которых хранятся указатели на родителя, левого и правого ребёнка вершины х соответственно. Если р[х] = nil, то ж - корень; если у ж нет левого или правого ребёнка, то left[x] или right[x] есть nil. С деревом Г связан атрибут root[T] - указатель на его корень. Если root[T] = nil, то дерево Г пусто.


Рис. 11.9 Представление двоичного дерева Т. Каждая вершина х включает поля р[х] (сверху), left[x] (внизу слева) и right[x] (внизу справа). Ключи на схеме не показаны.

Корневые деревья с произвольным ветвлением

Если известно, что число детей каждой вершины ограничено сверху константой к, то такое дерево можно реализовать аналогично двоичному дереву, помещая указатели на детей в поля childi, child2,..., child, заменяющие поля left и right. Если количество детей может быть любым, так делать нельзя: заранее неизвестно, сколько полей (или массивов - при представлении с помощью нескольких массивов) надо выделить.

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

Как же быть? Заметим, что любое дерево можно преобразовать в двоичное. При этом у каждой вершины будет не более двух детей: левый ребёнок останется тем же, но правым ребёнком станет вершина, которая была правым соседом (непосредственно следующим ребёнком того же родителя). Теперь это двоичное дерево можно хранить описанным выше способом.

Опишем схему хранения деревьев с произвольным ветвлением, основанную на этой идее, более подробно. Она называется «левый ребёнок - правый сосед» (left-child, right-sibling representation) и показана на рис. 11.10. По-прежнему в каждой вершине хранится указатель р на родителя и атрибут root[T] является указателем на корень дерева. Кроме р, в каждой вершине хранятся ещё два указателя:

1. left-child[x] указывает на самого левого ребёнка вершины ж;


Рис. 11.10 Представление дерева Т по схеме «левый ребёнок - правый сосед». В каждой записи х присутствуют поля р[х] (сверху), left-chila\x] (внизу слева) и right-sibling[x] (внизу справа). Ключи не показаны.

2. right-sibling[x] указывает на ближайшего справа соседа вершины х («следующего по старшинству брата»)

Вершина х не имеет детей тогда и только тогда, когда left-child[x] = NIL. Если вершина х - крайний правый ребенок своего родителя, то right-sibling[x] = NIL.

Другие способы представления деревьев

Иногда встречаются другие способы представления деревьев. Например, в главе 7 при реализации кучи не надо было хранить указателей на родителя и детей, поскольку их номера получались умножением и делением на 2. В главе 22 нам встретятся деревья, по которым двигаются от листьев к корню (и потому указатели на детей или соседей не нужны). Конкретный выбор представления дерева определяется спецификой задачи.

Упражнения

11.4-1 Нарисуйте двоичное дерево, представленное следующим образом:



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196] [стр.197] [стр.198] [стр.199] [стр.200] [стр.201] [стр.202] [стр.203] [стр.204] [стр.205] [стр.206] [стр.207] [стр.208] [стр.209] [стр.210] [стр.211] [стр.212] [стр.213] [стр.214] [стр.215] [стр.216] [стр.217] [стр.218] [стр.219] [стр.220] [стр.221] [стр.222] [стр.223] [стр.224] [стр.225] [стр.226] [стр.227] [стр.228] [стр.229] [стр.230] [стр.231] [стр.232] [стр.233] [стр.234] [стр.235] [стр.236] [стр.237] [стр.238] [стр.239] [стр.240] [стр.241] [стр.242] [стр.243] [стр.244] [стр.245] [стр.246] [стр.247] [стр.248] [стр.249] [стр.250] [стр.251] [стр.252] [стр.253] [стр.254] [стр.255] [стр.256] [стр.257] [стр.258] [стр.259] [стр.260] [стр.261] [стр.262] [стр.263] [стр.264] [стр.265] [стр.266] [стр.267] [стр.268] [стр.269] [стр.270] [стр.271] [стр.272] [стр.273] [стр.274] [стр.275] [стр.276] [стр.277] [стр.278] [стр.279] [стр.280] [стр.281] [стр.282] [стр.283] [стр.284] [стр.285] [стр.286] [стр.287] [стр.288] [стр.289] [стр.290] [стр.291] [стр.292] [стр.293] [стр.294]