繁体   English   中英

二叉树的层级遍历C ++

[英]level order traversal of binary tree c++

嗨,我通过互联网阅读了此逻辑,并尝试在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来实现呢?有人对此有任何想法吗?

此发布的代码未考虑树的叶子处的空指针。 可以按照以下方式固定:

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. 分配给temp的内存已泄漏且不必要
  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);
    }
}

编辑:根据评论处理空树。

您的想法似乎是正确的,但是在不知道实际数据的情况下这是无法分辨的。 在您的代码中, left成员和right成员可能为NULL或指向未定义的位置,这意味着跟随leftright指针可能会导致错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM