我想我对队列弹出功能的工作方式有些困惑。
首先,我不确定队列是如何实现的,无论是链表还是队列。但是,如果它是一个链表,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);
}
}
感谢任何帮助,谢谢!
答案 0 :(得分:0)
之所以起作用,是因为队列仅保留指向Node
的指针。访问front
时,它将返回指针的副本。当队列pop
被设置时,也只有指针被破坏了,而不是指向Node
的指针。
std::queue
的默认实现是std::deque
-但实际上可以通过设置模板参数来更改。