二叉树c ++的级别顺序遍历

时间:2014-04-11 09:16:30

标签: c++ algorithm binary-tree traversal

您好我通过互联网阅读此逻辑并尝试在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。任何人对此有任何想法吗?

3 个答案:

答案 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)

两个问题:

  1. 为临时分配的内存泄露且不必要
  2. 未检查叶节点的空指针
  3. @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)

您的想法似乎是正确的,但是如果不了解实际数据,这是不可能的。在您的代码中,leftright成员可能NULL或指向未定义的位置,这意味着遵循leftright指针可能会导致错误。