Коды Прюфера

Материал из WEGA
Перейти к навигации Перейти к поиску

Пусть T - дерево с множеством вершин {ν1,ν2,...,νn}. Будем считать, что номер вершины νi равен i. Сопоставим дереву T последовательность [a1,a2,...,an2] называемую кодом Прюфера, по следующему правилу:

   функ КОД_ПРЮФЕРА(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 (рис.) код Прюфера имеет вид:

P2(T) = [2, 5, 5, 2, 1, 3, 3].

Prufer 1.gif


Распаковка кода Прюфера осуществляется следующим образом:

   функ РАСПАКОВКА (A: код)=
   1.    Пусть T состоит из вершин {ν1,ν2,...,νn} таких, что номер вершины νi равен i,где n - длина кода A плюс 2;
   2.    B: = [1 : n];
   3.    для i от 1 до n+1 цикл
   4.        b:=min{k ∈ B ; k  A[j] для любого j  i};
   5.        В T добавить ребро, соединяющее вершины с номерами b и A[i];
   6.        B:=B-{b}
         всё;
   7.    возврат T
   всё

В случае корневого ордерева процедуры построения кода Прюфера и его распаковки аналогичны. Необходимо только на последнем месте в A указывать корневую вершину и при распаковке кода A исключать номер этой вершины из множества B.

Операции над деревьями и кодами Прюфера

Будем считать, что вершины двух разных деревьев нумеруются различными числами, причём номера одного дерева всегда больше или меньше любого номера другого. Это требование часто выполняется в практических реализациях, т.к для вершин каждого дерева обычно отводят последовательные массивы номеров ячеек памяти. Если все номера дерева T1 (или ориентированного дерева T1) меньше всех номерова дерева T2 (или T2) то пишут T1<T2 (или T1<T2).

Рассмотрим следующие операции над деревьями:

ba - операция замены номера a вершины T на номер b;

a0b - операция склеивания двух деревьев по вершинам a и b, т.е. дерево T1a0bT2 получается из T2 и T1 отождествлением вершин a из T1 b из T2 и присвоением склеенной вершине номера b (при склеивании ордеревьев добавляется требование, чтобы вершина b была корневой).

На рис 2.22 представлен результат выполнения операции T13010T2, где T1 и T2 - деревья, изображённые на рис. 2.20 и 2.21.

Рассмотрим некоторые вставки кода Прюфера: [] - операция формального отбрасывания квадратных скобок; определена на всех выражениях вида [a1,a2,...,an],b,[b1,b2,...,bm] и состоит в отбрасывании всех внутренних квадратных скобок и добавлении двух внешних;

c -операция вставки кода Прюфера; если


P2(T1)=[a1,a2,...,ak,c,ak+2,...,an1]

и среди чисел ak+2,ak+3,an1 нет числа c, то

P2(T1)cP2(T2)=[a1,a2,...,ak,P2(T2),c,ak+2,...,an1].

Справедливы следующие соотношения, связывающие операции над деревьями и кодами Прюфера:

если T1<T2, то

P2(T1a0bT2)=[P2(baT1),b,P2(T2)];

если T1>T2, то необходимо рассматривать дерево T1b0aT2, и всё сводится к предыдущему случаю;

если T1<T2, то

P2(T1a0bT2)=[P2(baT1),c,P2(T2)],

где c - непосредственный предок вершины a в дереве T1


если T1>T2, то

P2(T1a0bT2)=[P2(T2),P2(baT1)],