您好我通过互联网阅读此逻辑并尝试在c ++中实现级别顺序树遍历
void levelorder(struct node* root)
{
struct node* temp = (struct node*)malloc(sizeof(struct node));
std::queue<node*> qq;
if(root==NULL)
{
return;
}
qq.push(root);
while(!qq.empty())
{
temp=qq.front();
qq.pop();
printf("%d",temp->data);
qq.push(temp->left);
qq.push(temp->right);
}
}
但是上面给出了一个我认为正在发生的错误分段错误,因为
temp->left
不存在。或者我应该为此实现需要llQueue。任何人对此有任何想法吗?
答案 0 :(得分:3)
发布的代码没有考虑树叶处的空指针。它可以按以下方式修复:
void levelorder(struct node* root)
{
std::queue<node*> qq;
qq.push(root);
while(!qq.empty())
{
struct node* node = qq.front();
qq.pop();
if (node) {
printf("%d",temp->data);
qq.push(temp->left);
qq.push(temp->right);
}
}
}
另一方面,对temp的内存分配也会丢失:此空间不会被释放,而且会因为temp被分配给其他地方而泄漏。
答案 1 :(得分:2)
两个问题:
@anumi提出的实施是正确的。但我更喜欢这个:
void levelorder(struct node* root)
{
if(!root) return;
std::queue<node*> qq;
qq.push(root);
while(!qq.empty())
{
struct node* node = qq.front();
qq.pop();
printf("%d", node->data);
if(node->left) qq.push(node->left);
if(node->right) qq.push(node->right);
}
}
编辑:根据评论处理空树。
答案 2 :(得分:0)
您的想法似乎是正确的,但是如果不了解实际数据,这是不可能的。在您的代码中,left
和right
成员可能NULL
或指向未定义的位置,这意味着遵循left
或right
指针可能会导致错误。