![]() |
|
Главная Терминология Хоора 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 операции перебалансировки. Эмпирические оценки что сбалансированные деревья теряют большую часть cr привлекательности, если нужна плотная упаковка ащ ![]() ![]() id) (е) (f) Рис. 4.34. Включение в сбалансированное дерево. В самом деле, трудно превзойти простой и очевидный алгоритм включения в дерево! 4.4.8. Удаление из сбалансированного дерева Учитывая наш опыт с удалением из дерева, мы можем предположить, что в случае сбалансированных деревьев удаление будет еще более сложным, чем включение. Это верно, хотя операция балансировки остается в основном такой же, что и при включении. В частности, балансировка состоит из однократного или двукратного поворота узлов. Удаление из сбалансированного дерева основано на алгоритме (4.52). Простыми случаями являются удаление терминальных узлов и узлов с одним потомком. Если же узел, который нужно удалить, имеет два поддерева, мы вновь будем заменять его самым правым узлом левого поддерева. Ка и в случае включения (4.63), добавляется булевский параметр-переменная h, означающий, что высота поддере^ уменьшилась . Вопрос о перебалансировке рассматривается только при h = true. Значение true присваивается h~ при нй хождении и удалении узла или если сама балансировка уменьшает высоту поддерева. В программе (4.64) мы вводим йММетричные) операции балансировки в виде процедур, к как в алгоритме удаления к ним обращаются несколько яз Отметим, что balance 1 используется, когда уменьщается PjcoTa левого, а balance 2 - правого поддерева. ![]() Рис. 4.35. Удаления из сбалансированного дерева. Работа нашей процедуры иллюстрируется на рис. 4.35. Если задано сбалансированное дерево (а), то последовательное удаление узлов с ключами 4, 8, 6, 5, 2, 1 и 7 дает деревья (Ь),..., (h). Удаление ключа 4 само по себе просто, так как он пред- тавляет собой терминальный узел. Однако при этом появ-Йется несбалансированность в узле 3. Его балансировка тре- procedure delete(x: mieger; таг р: ref; var h. booJecm); vat g: ref; {h = false} procedure (var p: ref var h: boekai); var p\,p2: ref; b\,b2: -1 . +1; begin [h-true, левая ветвь стала короче) case pl.baloi -1: pX.bal := 0; 0: begm p\.bal := +1; Л := false end ; I: begin [балансировка] p\ := p].right; Ы := pl\M; if Й1 > 0 then begin [однократныйRR-noeopom] P\.right := p\].left; p\].left : p; if 61 = 0 then begin pf.bal := +1; pl\.bal := -1; h := false end else begin pl.bal 0; рЦ.Ъа! 0 end ; p:=-pl end else begin [двукратный RL-noeopom] p2 pltleft; b2 := p2\.bal; plbleft : p2].right; p2\.right : pi; p\.rlght := p2]Jeft; p2].left p; if И = +1 then pMl := -1 else p]M 0; if Ъ2 -1 then рЦ.Ьа1 := +1 else рЦ.Ъа1 := OJ p p2; p2\.bal ;= 0 end end [balance 1}; бует однократного поворота налево. Балансировка вновь новится необходимой после удаления узла 6. На этот правое поддерево корня балансируется однократным пово том направо. Удаление узла 2, хотя само по себе просто как он имеет только одного потомка, вызывает сложный'J кратный поворот направо и налево. И четвертый случай: л?! кратный поворот налево и направо вызывается удалени^ узла 7, который прежде заменяется самым правым элемент^ левого поддерева, т. е. узлом с ключом 3. |