40
правок
Изменения
→Реализация
t1 = n, t2 = 0 // указатели на ячейки массивов сразу после последнего элемента в этих массивах
check = 0 // считает на сколько стало меньше элементов
temp // ... чтение данныхпеременная, на которую ссылаются самые нижние листья дерева class vert{ // класс - лист дерева, которое, по сути, строится в коде хаффмана '''while''' public: val // значение кодового символа {0,1} w // сумма в данном поддереве left // самый левый элемент начального массива в данном поддереве, чтобы упростить поиск при спуске check < n// проверка на то, является ли данный лист самым нижним в дереве '''while''' h1 < t1 *nextl, *nextr // проходим по массиву, выполняющему роль первого; внутри этого цикла мы ищем минимумы указатели на левого и записываем суммыправого детей vert(){ '''if''' h2 check =1; val = t20; } }; make(int str1, int str2, int pos1, int pos2)// функция, которая суммирует, задает указатели и значения переменных val и left sum[s2][t2] .w = sum[s1str1][h1pos1] .w + sum[s1str2][h1+1pos2].w '''if''' t1 - h1 sum[s2][t2].nextl == 1&sum[str1][pos1] sum[s2][t2] .nextr = &sum[str2][pos2] sum[s2][t2] - .left = min(sum[str1][pos1].left,sum[str2][pos2].left) sum[s1str1][h1+1pos1].val = 0 h1 sum[str2][pos2].val = h1 + 21 t2++ coding(sum) '''elsewhile'''check < n '''while''' h1 < t1 // проходим по массиву, выполняющему роль первого; внутри этого цикла мы ищем минимумы и записываем суммы '''if''' sum[s1][h1] .w < sum[s2][h2].w '''if''' sum[s1][h1+1] .w < = sum[s2][h2].w make(s1,s1,h1,h1+1) '''if'''(t2 - h1 == 2) sum[s2][t2] .w -= sum[s1][h1+1] + .w sum[s1s2][h1+1t2].nextr = &temp; h1 += 2 '''else''' make(s1,s2,h1,h2) h1++ h2++ t2++
'''else'''