首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >树:使用队列的级别顺序遍历

树:使用队列的级别顺序遍历
EN

Stack Overflow用户
提问于 2016-02-15 23:05:04
回答 1查看 2.2K关注 0票数 0

我编写了使用队列遍历树的代码,但是下面的去队列函数会产生错误,head = p->next有什么问题吗?我搞不懂为什么这部分是错的。

代码语言:javascript
运行
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-15 23:51:13

while循环的条件是:

代码语言:javascript
运行
复制
while (tmp != NULL) {

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

代码语言:javascript
运行
复制
    tmp = dequeue();

但是,在查看dequeue的实现时,这是不可能的:

代码语言:javascript
运行
复制
node* dequeue(void) {
    node *p;
    p = head;

在这里,p被取消引用:

代码语言:javascript
运行
复制
    head = p->next;

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

在这里,p被返回:

代码语言:javascript
运行
复制
    return p;
}

要返回一个NULL指针并保留while循环,p必须是NULL。但是,在此之前,NULL指针将使用head = p->next;取消引用,这将导致分段错误(从C语言的角度来看,UB)。

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

代码语言:javascript
运行
复制
node* dequeue(void) {
    node *p;
    if (!head)
         return NULL;

...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35420750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档