gpt4 book ai didi

c - 树:使用队列进行层序遍历

转载 作者:行者123 更新时间:2023-11-30 17:05:10 28 4
gpt4 key购买 nike

我编写了使用队列遍历树的代码,但是下面的出队函数生成错误,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;
}

最佳答案

while 循环的条件是:

while (tmp != NULL) {

因此,只有当 dequeue 返回 NULL 时,它才会终止:

    tmp = dequeue();

但是,当查看出队的实现时,这不会发生:

node* dequeue(void) {
node *p;
p = head;

这里,p 被取消引用:

    head = p->next;

if (head == NULL) {
tail == NULL;
}

这里返回了p:

    return p;
}

要返回 NULL 指针并离开 while 循环,p 此处必须为 NULL。但是,NULL 指针将在之前使用 head = p->next; 取消引用,这将导致段错误(就 C 语言而言,UB) .

您应该在出队函数的开头检查 head 是否为 NULL 指针,并在这种情况下返回 NULL:

node* dequeue(void) {
node *p;
if (!head)
return NULL;

...

关于c - 树:使用队列进行层序遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35420750/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com