Коды Прюфера: различия между версиями
ALEXM (обсуждение | вклад) Нет описания правки |
KVN (обсуждение | вклад) Нет описания правки |
||
Строка 21: | Строка 21: | ||
Распаковка кода Прюфера осуществляется следующим образом: | Распаковка кода Прюфера (или восстановление дерева по коду Прюфера) осуществляется следующим образом: | ||
'''функ''' РАСПАКОВКА (A: '''код''')= | '''функ''' РАСПАКОВКА (A: '''код''')= | ||
Строка 27: | Строка 27: | ||
что номер вершины <math>\nu_i</math> равен <math>i</math>,где n - длина кода A плюс 2; | что номер вершины <math>\nu_i</math> равен <math>i</math>,где n - длина кода A плюс 2; | ||
2. B: = [1 : n]; | 2. B: = [1 : n]; | ||
3. '''для''' i '''от''' 1 '''до''' n | 3. '''для''' i '''от''' 1 '''до''' n-2 '''цикл''' | ||
4. b:=min{k ∈ B | 4. b:=min{k ∈ B : k <math>\neq</math> A[j] для любого j <math>\geq</math> i}; | ||
5. В <math>T</math> добавить ребро, | 5. В <math>T</math> добавить ребро, соединяющее вершины | ||
с номерами <math>b</math> и <math>A[i]</math>; | |||
6. B:=B-{b} | 6. B:=B-{b} | ||
'''всё;''' | '''всё;''' | ||
7. '''возврат''' ''T'' | 7. В <math>T</math> добавить ребро, соединяющее вершины | ||
всё | с номерами, оставшимися в В; | ||
8. '''возврат''' ''T'' | |||
'''всё''' | |||
В случае корневого ордерева процедуры построения кода Прюфера и его распаковки аналогичны. Необходимо только на последнем месте в <math>A</math> указывать корневую вершину и при распаковке кода <math>A</math> исключать номер этой вершины из множества <math>B</math>. | В случае корневого ордерева процедуры построения кода Прюфера и его распаковки аналогичны. Необходимо только на последнем месте в <math>A</math> указывать корневую вершину и при распаковке кода <math>A</math> исключать номер этой вершины из множества <math>B</math>. |
Версия от 05:02, 31 мая 2017
Пусть T - дерево с множеством вершин
функ КОД_ПРЮФЕРА(T: дерево) = 1. Пусть n - число вершин в T, а A - целочисленный вектор длины n-2; 2. B:= [1 : n]; 3. для i от 1 до n-2 цикл 4. b:=min{k ∈ B; k - номер висячей вершины}; 5. A[i]:= номер вершины, смежной вершине с номером b; 6. B:=B-{b}; 7. Удалить из T вершину с номером b всё 8 возврат A всё
Рассмотрим седующий пример. Для дерева T (рис.) код Прюфера имеет вид:
Распаковка кода Прюфера (или восстановление дерева по коду Прюфера) осуществляется следующим образом:
функ РАСПАКОВКА (A: код)= 1. Пусть T состоит из вершинтаких, что номер вершины равен ,где n - длина кода A плюс 2; 2. B: = [1 : n]; 3. для i от 1 до n-2 цикл 4. b:=min{k ∈ B : k A[j] для любого j i}; 5. В добавить ребро, соединяющее вершины с номерами и ; 6. B:=B-{b} всё; 7. В добавить ребро, соединяющее вершины с номерами, оставшимися в В; 8. возврат T всё
В случае корневого ордерева процедуры построения кода Прюфера и его распаковки аналогичны. Необходимо только на последнем месте в
Операции над деревьями и кодами Прюфера
Будем считать, что вершины двух разных деревьев нумеруются различными числами, причём номера одного дерева всегда больше или меньше любого номера другого. Это требование часто выполняется в практических реализациях, т.к для вершин каждого дерева обычно отводят последовательные массивы номеров ячеек памяти. Если все номера дерева
Рассмотрим следующие операции над деревьями:
На рис 2.22 представлен результат выполнения операции
Рассмотрим некоторые вставки кода Прюфера:
[] - операция формального отбрасывания квадратных скобок; определена на всех выражениях вида
и среди чисел
.
Справедливы следующие соотношения, связывающие операции над деревьями и кодами Прюфера:
если
если
если
,
где
если
,