Page 50 - 6110
P. 50

Процедура  знаходження  попереднього  даному  елементу  є
                            симетричною. Обидві процедури знову ж таки знаходять елемент за
                            час, пропорційний Т(h).
                                Процедура  додавання  елементу  в  бінарне  дерево  T  додає
                            елемент,  зберігаючи  умову  впорядкованості.  Параметром  тут  є
                            вказівник  z  на  нову  вершину,  в  якій  розміщене  значення  val[z],
                            left[z]=right[z]=NULL:
                                INSERT (T, z)
                                1  y:=NIL
                                2  x:=root[T]
                                3  while x <> NULL
                                4    do y:=x
                                5      if val[z] < val[x]
                                6        then x:=left[x]
                                7        else x:=right[x]
                                8  p[z]:=NULL
                                9  if y = NULL
                                10   then root[T] :=z
                                11   else if val[z]<val[y]
                                12     then left[y]:=z
                                13     else right[y]:=z
                                Процедура рухається вниз по дереву, при цьому зберігаючи в y
                            вказівник  на  батька  вершини  x.  Порівнюючи  значення  в  x  та  z,
                            процедура  вирішує,  в  яке  з  піддерев  рухатись  далі.  Процес
                            завершується  тоді,  коли  x=NULL.  Саме  сюди  й  слід  помістити
                            вершину  z  (рядки  8-13).  Ця  операція  також  потребує  часу  для
                            виконання, пропорційного Т(h)
                                Параметром для процедури видалення елементу є вказівник на
                            вершину, що видаляється. Тут можливі три варіанти дій:
                                -  якщо  у  вершини  немає  дітей,  достатньо  помістити  NULL  у
                            відповідне  поле  його  батька  (замість  вказівника  на  вершину,  що
                            видаляється);
                                -  якщо  у  вершини  є  одна  дитина,  можна  з'єднати  батька  цієї
                            вершини безпосередньо з її дитиною;
                                - якщо вершина має двох дітей, слід спочатку знайти слідуючий
                            (в  сенсі  порядку)  елемент  y,  в  якого  немає  лівої  дитини,  а  потім
                            скопіювати  значення  та  додаткові  дані  з  вершини  y  на  місце
                            вершини, що видаляється, а саму вершину y видалити:
                                DELETE (T, z)
                                1  if left[z] = NULL or right[z]=NULL
                                2    then y:=z
                                3    else y:=SUCCESSOR(z)
                                4  if left[y] <> NULL
                                5    then x:=left[y]
                                                            49
   45   46   47   48   49   50   51   52   53   54   55