Я написал коды, которые пересекают дерево, используя очередь, но функция dequeue ниже генерирует ошибку. Есть ли проблемы с head = p->next
? Я не могу понять, почему эта часть неверна.Дерево: порядок уровней Обход с использованием очереди
void Levelorder(void) {
node *tmp, *p;
if (root == NULL) return;
tmp = root;
printf("The level order is :\n");
while (tmp != NULL) {
printf("%d, ", tmp->data);
if (tmp->left) {
enqueue(tmp->left);
}
if (tmp->right) {
enqueue(tmp->right);
}
tmp = dequeue();
}
return;
}
void enqueue(node *p) {
if (head == NULL) {
head = p;
}
else {
tail->next = p;
}
tail = p;
p->next = NULL;
tail->next = NULL;
return;
}
node* dequeue(void) {
node *p;
p = head;
head = p->next;
if (head == NULL) {
tail == NULL;
}
return p;
}
Благодарим Вас за HEP. но до сих пор не может понять идею отсроченного остроумия «head = p -> next». Как p, который содержит NULL-указатель, может быть отсрочен «head = p-> next»? – Ezerk
@Ezerk Это не может, поэтому программа вылетает в этот момент. Возможно, вы раздражены, что у вас нет выхода вообще; это потому, что 'printf()' обычно строит буферизацию своего вывода на терминальных устройствах. – Ctx
Спасибо за ваш комментарий. – Ezerk