Искусство программирования на Си (984073), страница 38
Текст из файла (страница 38)
значснис йегя нового узла, устанавливает указатели на 145 е1яе Удобное вссго разделить все возможные варианты надва л В В дочерна узлы на ]Ч[ЛЛ., устанавливает значснис полл 146 апяегС(и->Ьа1 == +1); случая: у находится е левом поддерсве узла х (строки и и 141 «ч = х = я->Ипх[1); Ьа] равным О, увеличивает поле соцп! структуры !гее на ! 36 — 166). и у — в правол«полдсреве узла х (строки 166— 140 и->11пх[1] = х->Ипх[0); сдиницу и возврашаст новый узел.
В противном случае она возвращает нулсвой указатель. 195). Эти случаи аналогичны, поэтому рассмотрим код 150 только для первого случая. Код в строках 104 †1 производит поиск и вставю 151 х->1лпк[1] = х; Если коэффициент сбалансированности узла х раасн узла в АНЕ-дсрево. Он аналогичен соответствующему и« ч« х 152 11 (х->Ьа1 == -1) [ ь] или О, то это простой случай: можно просто помес- Орлан и начин данные $٠— ' Часть И Ламл наде< и»пи< Мрен> Глава 12 205 зпт Х = 17 269 и = ар[В]7 333 3рстий случай (строки 241 — 261) несколько сложнсс.
270 хв (ад[В] == О) В процсссс прохожлсния дсрсва при поиске наслслни- 207 вттпст ач1 пода ** , *г. ач1 пода у, гг 271 1< (и->Ьа1 == -1] [ 335 и->1тпк<0< = х->1тпк[1[; ка узла т (строки 247 †2) нсобходимо держать прой- 208 272 и->Ьа1 = 0; 336 х->1зпх[11 = м< 209 авватт(Став .= НОЬЬ); 273 соптзппа лснныс узлы в стскс (строки 250 и 251). И с<цс один мо- 210 274 338 )Г (х->Ьа1 == О) ( мент: поскольку узел х заменяется узлом», нужно 211 ад[01 = О; 275 а1ве 11 (в->Ьа1 == О) ( 339 х->Ьа1 = +1; также в стскс замснить х на » <строки 254 и 255) 212 ар[О) = (встать аи1 асн)е *) астее->тост< 276 в->Ьа1 = 1; 340 Ьтеах; Г[срсходис< к этапу базансировки (строки 265 †3).
213 277 Ьтеа)с; 341 Он осу<цсствлястсв почти так жс, как при вставке узла 214 г = стае->тоот; 278 342 е1ва 215 т (;;) ( от (;;) ( 279 343 и->Ьа1 = х->Ьа1 = 07 в АЧЕ-дсрсво, но иногла приходится выполнять нс- 216 тат 41т; 280 344 сколько ротаций. 217 11 [г == ИОЬЬ] 281 345 е1ве т( (х->Ьа1 == +1] [ [[икл выполнвстсл ло тсх пор, пока в стеке есть узлы. 218 татвтп 0; 282 х = в->11пк[ 1 1; 346 В начачс каждого цикза» присваивастся верхний узел 283 авнатт(х 1= ВОЬЬ). стока (строка 269). Элемент ад[К[ содсрж<п индекс мвс- 220 Ьтаак; 284 348 г->1зпк[01 = х; 221 285 11 (х->Ьа1 > -1) ( в и->1лп)с[0) = г->1<ах(1 1; сива »->1]ай[[ поддерева, из которого был удален узсл. 222 дтт = 1саа > г->даса< 286 ю->1[ах[1] = х->1[ах[0)< 350 г->1зпк[1) = и; Как и при встввкс при удалснии возл<ожны два сим- 223 ар()с) = х; 287 351 1( (г->Ьа1 == -1) ( матричных случая.
Рассмотрим вариант, когда ад[)с[ 224 ад[В++) = дьтз 288 ар[к - 1)->)ьпк(ад[ — 1]) = х; 352 в->Ьа1 = 1; равно 0 (строки 270 — 317), т.с. узел улалястсл с лсвого 225 г = г->1[па[4<с)< 289 < >Ь 1 О) < 353 х->Ьа1 = О; 226 ) 290 х->Ьа1 = -1; 354 ) 227 291 а1ва г0 (г->Ьа1 == 0) Возможны два простых случая.
Если коэффициснт изф, ' 7 й Пансе во девичее нт дерев> Глава 12 ввслена Гибалсом (С'сба)б) и Седжвиком (бес(кете[с(с) в ее х (978 г. Вставка 154 у = ар[а1с — 1[; +2 О 155 В дереве тес)-Ыасй каждый узел ассоциируется с оп- Бсз лишних прелюдий рассмотрим код, которыи встав- х = ар(ах — 2)! х чч рсдсленным цветом: красным или черным. Баланс дос- ляст с зсл в дерево гес(-Ь(аск. 157 х->со1ог = ВВ ВЕО; А +1 тигается путем упорядочения узлов определенным об- 158 у->со1ог = ВВ ВЬЛСЕ; П+1 100 гпе гЬ ьпвегг(вггпсе гЬ Ггее *Егее, гпе разом с учетом их цвета.
Точные правила выглядят 1геп) х->1!па(0) = У->11пх(1)' В А В следующим образом: 101 ( П и 161 у->11п)с[1) = х; ). Красныс узлы могут иметь только черные дочерние 162 ар[ах — 3)->11пх[аа(ах - 3)) = у; узлы. 103 гпс ад(48[! 163 104 гпс а!с; 164 Ьгеах; 2. Вес пути от узла до любого листа, расположенного 105 165 ) ниже в дереве, содержат одно и то жс количество 106 всгпсс гЬ поде *х, 'у; 166 ) +2 -1 черных узлов.
107 167 е1ве ( 108 аввегс(ггее != ВОЬЬ); 168 У = аР[ах — 2)->11пх[0); х мс Кроме того. корневым узлом дерева гас[-Ыасй в этой 109 18 [Егее->гоос == ВВЬЬ) 169 И (у 1= Ивьь бь у->со1аг А О +1 С главе лля простоты кола всегда булст черньсй узел. 110 Ггее->гоог = пем паап(егее, гсеа, вв вео) П+1 В общем случае корневым узлом дерева гсс(-Ыас1 может 88 Вьаск); — 170 ар[-ах)->со1ог = у->со1ог 111 геспгп Егее->гоог 1= ВВЬЬ; ЕВ Вьаск! В С А В быть узел любого цвета. 112 ) 171 ар[-ах)->со1ог = ВВ ВЕО; П+1 П+1 П+1 Высапса данного узла на черным узлам — это количс- 113 67 ство черных ухюв на пути от данного узла ло листа, нс 114 аа(0) = 0; 173 е1ве ( С ~н-1 а) 7<опек пода ичнок<уЯреиу ЩД— Орсини>ацип данник ° 4 Глава 12 Часть 1! И последний этап — устанавливасм черный пвст лля 255 Строки 118 — 136 знакомы вам по поиску по двоича а корневого узла (строка !95).
Это вссгда можно сдслать, 256 11 (У >со]ог == "В "80) ( ному дереву и по вставке нового узла. Кромс того, каж- 257 (гее(у)1 поскольку это нс приводит к нарушению правил. дый пройденный узсл для послслуюшсго использования ь г58 гехпгп 1; при балансировке записывается в стек (строки 126 и Удаление 259 ] 127). 260 Первоначально новый узел х считается красным.
О Е А О Е < спорь рассмотрим прон«дуру удаления узла. Начнем с 261 Ггее(у)1 Рассмотрим правила для дсрсва гсдкЫас1, которые при листинга. 263 ив]1е (1 > 1 44 (х == ВОЬЬ [[ х->со1ог этол< могут быть нарушены. Вставка красного узла нс В С 202 1п«гЬ де1е«е (есгпс««Ь с«ее *Гхее, 1п«кпее) 88 ВЬАСК)) нарушает правило 2, поскольку она нс изменяет коли- гоз ( 264 11 (ад[)с — )] == 0) ( чсство чсрных узлов ни на одном пз путей. Но это мо- 204 асгпсв гЬ поде *ар[48); 265 е = ар(к — 11->1«пк]11; а а 205 1пс ад[481; 266 жст нарушить правило 1: если родительский узсл ута лпс )с; 267 11 (а->со1ог == ДВ ВЕО) х красный, то вставка красного узла л нс разрсшастся и 207 268 и->со1ог = 88 ВЬАСК; У нам придстся вноси~ь измснсния в структуру. О У 208 всгпсс гЬ поде ие, *х, *у, *г; 269 ар[А — 1]->со1ог = ВВ 880; []игл в строках 138 в 193 повторяется до тех пор, 209 270 пока нс будет удовлетворено первое правило В начале 210 аввегс(сгее 1= ИОЬЬ); 271 аР[1с — 11->1]па[1 1 = е->11пх[0)1 А С 211 272 е->1]п1с[0) = ар[)с — 1); каждой итсрапии мы сч<насм, чю узсл х являсгся крас- ад[О) = 0; ным, так жс как ого родительский узел ар[а)с-][.
(В дсй- В С А В ствитсльности х в ш<клс отсутствуст. При нсоблолимо- ар[к) = ар[к — 11; в с а) Оиигл ни дини исаа> дгранс Орюни сан ил диннчн Часть й Глава !2 316 з Е [ч->со)ог == ЕВ ЕЕП) нивается со зна'сенном Ыеш, узлы, по которым осушс- Нд рис. 128 ссрныс узлы залиты черным цветом.
а Слусан 2 (рис. !2.8 Ь, строки 283 288). Если узел ч 316 ч->со1ог ствляется продвижение, заносятся в стек. Если значс- красныс оставлен ь! незалитыми. Узлы, залитыс серым нс имеет красного дочернего узла (узлы Ь и с могут быть 317 ар[К вЂ” 11->со1ог = ЕВ ЕЕП! ние Иегп найдено, цикл завершается. При выходе из сссссгом, могут быть либо черными, либо красными. черными либо вообшс отсутствовать), то его цвет мож- цикла г является узлом, который необходимо удалить, Ус и! не обознсченнссс в кодс функции для удобствз но просто зал!спить на красныи Это позволяет убрать 319 ар[К вЂ” 11->11лх[01 = ч->1ла1с[11; 320 ч->11лк[11 = ар[к — ); 1' - к 11; ра[К-1] является родительским у~лом узла г и т д. отхссчсны как и, Ьи г.
Поддерсвья обозначеньс пропис- олин черный узел из правого полдерева родительского 321 ар[К вЂ” 21->11пК[ад(К - 211 Методика, которая используется для удаления узла ными буквами. узла узла х, соотвстствуюший чсрнолсу ух!у, удалснно- 322 в функции гЬ бе[е[еП, немного отличается от мстоди- Случай ! (рис. [2.8 а, строки 267-28!). С этим слу- му в х. Таким образом восстанавливается правило 2 лля 323 ар(!с! = вр[1с — 11; ки, примснясмои в функциях ач! бе1е[еП и Ьсп бе!е[еП. чаем, когда узел ъ — красный, легче справиться, про- поддерева. Тем нс лсснсе, по-прежнему требуется про- поэтому рассмотрилс ее более подробно ас[[ К) = 1; образовав его к одному из трех других случаев, а нс раз- водить изменения вверх по дереву, поскольку высота 325 ар[К вЂ” 11 = ч; 326 кн+! Если узел г имеет меньше двух дочерних узлов, то решая сто напрямую.
Преобразование выполняется за вссгодсрсва почсрным узлам излсенилась. Поэтому цикл 327 указатель на этот узел в его ролитсльском узле залссня- счст левой ротации ъ на место, занилсасмое увзолс а, и выполняется до тек пор, пока стек будет содержать узлы. 320 ч = ар[К вЂ” 11->11пК[01; ется указателем на левый дочерний узел узла г, если обновления стека Обратите внимание, что такое пре- Случаи 3 (рис.