Я построил двоичное дерево (дерево хаффмана), используя приведенный ниже код, который занимает отсортированный в списке по возрастанию список, однако, когда он заканчивает работу, он печатает битовые шаблоны и несколько узлов, которые должны быть в дереве, нет.Двоичное дерево теряет узлы при построении дерева
Код существу:
наборы родительского узла к точке на двух нижних узлов
назначает внутреннюю частоту родительского узла
точки начало списка теперь на узлы 2, где он был (чтобы избежать повторного использования узлов)
Вставляет новый родительский узел int о правильной позиции в дереве
получает длину дерева
печати все узлы оставили в списке
итерацию, пока один узел не остается (который является корнем).
Любые идеи относительно того, почему его «теряющие» узлы на этом пути?
void build_tree(pqueue *list)
{
node *temp;
node* parent_node;
int min_1, min_2, ind = 0, counter = 0, length = 2, head;
int characters[CHARACTERS];
temp = new_node();
while (length > 1)
{
min_1 = 0;
min_2 = 0;
temp = list->start;
parent_node = new_node();
parent_node->letter = '#';
min_1 = temp->frequency;
parent_node->left = temp;
temp = temp->next;
min_2 = temp->frequency;
parent_node->right = temp;
parent_node->frequency = min_1 + min_2;
list->start = temp->next;
while (ind == 0) /* inserting a node to the correct place */
{
if (temp != NULL && temp->next != NULL)
{
temp = temp->next;
if (temp->frequency >= parent_node->frequency) /* in the middle */
{
parent_node->next = temp->next;
temp->next = parent_node;
ind = 1;
}
else if (temp->next == NULL) /* at the end */
{
temp->next = parent_node;
parent_node -> next = NULL;
ind = 1;
}
}
}
ind = 0;
temp = list->start;
while (temp->next != NULL) /* get number of nodes left to insert into tree */
{
temp = temp->next;
counter++;
printf("%c : %d\n", temp->letter, temp->frequency);
}
printf("----------------------------------------------\n");
length = counter;
counter = 0;
}
printf("Found root with value of: %d\n", temp->frequency);
head = 0;
BitPatterns(temp, characters, head);
temp = list->start;
deallocate(temp, list);
}
void BitPatterns(node* root, int characters[], int head)
{
if (root->left)
{
characters[head] = 0;
BitPatterns(root->left, characters, head +1);
}
if (root->right)
{
characters[head] = 1;
BitPatterns(root->right, characters, head +1);
}
if (isLeaf(root))
{
printf("'%c' : ", root->letter);
GetChars(characters, head);
}
}
void GetChars(int characters[], int n)
{
int i, counter = 0;
for (i = 0; i < n; ++i)
{
printf("%d", characters[i]);
counter++;
}
printf(" (%d * \n", counter);
}
int isLeaf(node* root)
{
return !(root->left) && !(root->right) ;
}
Вам нужно показать код 'BitPatterns() для этого – user007
. Я добавлю его сейчас. –
Я добавил битпаттерны и getchars, как это называется в bitpatterns. isleaf - это просто 'return! (root-> left) &&! (root-> right);' –