Операции с двоичными деревьями Алгоритмы поиска 10 cur
Алгоритмы обхода дерева • Прямой ptr 10 5 -7 0 6 8 18 29
• Симметричный ptr -7 0 5 6 8 10 18 29
• Обратный ptr 0 -7 8 6 5 29 18 10
Поперечный обход дерева A B C D E F E F G H G A B C D E F G H C H H G
Удаление элемента из дерева • Элемента со значением, равным х, в дереве не существует; Элемент со значением х является терминальным узлом; Элемент со значением х имеет одного потомка; • • 3 2 3 7 0 5 4 2 9 6 7 0 11 5 4 9 6 11
• Элемент со значением х имеет двух потомков. 3 2 D P R PR 7 0 5 4 9 6 11
A Б R В Д R. right=D. right; P. left=R; P D =PR Г
A Б В D Г Д З P E PR Ж К И Л R PR. right=R. left;
Двоичные деревья, представляемые массивами A[i] Индекс левого наследника = 2*i+1. Индекс правого наследника = 2*i+2. Индекс родителя = (i-1)/2. Пример: int[] A={5, 1, 3, 9, 6, 2, 4, 7, 0, 8};
int[] A={5, 1, 3, 9, 6, 4, #, 7, #, #, #, 2};
Турнирная сортировка int[] A=new int [8] {85, 20, 15, -45, 10, 41, 10, 36}; 2 k N k=3
O(n log 2 n)
Пирамиды (heap-tree) Максимальные Минимальные
Преобразование массива в пирамиду n n-1 (n-2)/2 Пример: Построим максимальную пирамиду int[] H=new int[10] {7, 12, 72, 43, 9, 47, 18, 30, 72, 86} 5, 6, …, 9 4, 3, …, 0
H[4]=9 H[9]=86 H[3]=43 H[8]=72 H[2]=72 H[5]=47 H[1]=12 H[3]=72 H[0]=7 H[1]=86 7 12 H[7]=30 43 H[6]=18 H[4]=86 H[2]=72 30 72 9 72 86 47 18
Добавление элемента в пирамиду 86 72 72 43 30 12 7 9 47 80 18
Удаление из пирамиды 86 80 72 43 30 72 7 9 47 12 18
Добавление элемента в пирамиду 86 72 72 43 30 12 7 9 47 80 18
Пирамидальная сортировка Пример: int A[]={54, 21, 90, 38, 23, 0}; 54 21 38 90 23 38 23 0 21 0 n log 2 n