STL队列弹出混乱

时间:2018-11-06 06:02:43

标签: c++ tree queue pop

我想我对队列弹出功能的工作方式有些困惑。

首先,我不确定队列是如何实现的,无论是链表还是队列。但是,如果它是一个链表,pop()会删除前端节点,从而删除该节点(包括数据,对吗?),因此,当我们进入while循环时,我们将temp设置为等于队列的前端,然后立即流行吗?对我来说不太有意义;但是,我通过添加几个节点,然后按预期方式打印树和所有输出来进行了测试。

自从弹出前端以来,我一直期待未定义的行为,然后尝试访问前端的左右节点,但是前端只是弹出。

我认为,如果我们在while循环的末尾弹出,然后将rootTemp重新分配到前面,则更有意义。

我想我的主要问题是:为什么这样做?

此代码取自 https://www.geeksforgeeks.org/insertion-in-a-binary-tree-in-level-order/

/*function to insert element in binary tree */
void insert(struct Node* temp, int key) 
{ 
    queue<struct Node*> q; 
    q.push(temp); 

    // Do level order traversal until we find 
    // an empty place.  
    while (!q.empty()) { 
        struct Node* temp = q.front(); 
        q.pop(); 

      if (!temp->left) { 
        temp->left = newNode(key); 
        break; 
      } else
        q.push(temp->left); 

      if (!temp->right) { 
        temp->right = newNode(key); 
        break; 
      } else
        q.push(temp->right); 
    } 
} 

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

之所以起作用,是因为队列仅保留指向Node的指针。访问front时,它将返回指针的副本。当队列pop被设置时,也只有指针被破坏了,而不是指向Node的指针。

std::queue的默认实现是std::deque-但实际上可以通过设置模板参数来更改。

相关问题