c++ - 可以在循环中使用 C++ STL 的这个函数 queue::size() 影响行为吗
问题描述
我正在为二叉树的左视图编写代码。在循环中,当我输入条件时,因为i<q.size()
我得到不同的(错误的)输出以及将其存储在变量中并在循环中使用该变量时,例如:
int size = q.size();
for(int i=0; i<size; i++)
使用上述代码时,我得到了正确的输出。为什么会这样?
代码:
#include<queue>
using namespace std;
struct Node{
struct Node *left;
struct Node *right;
int data;
Node(int val){
left = NULL;
right = NULL;
data = val;
}
};
void leftView(Node *root){
queue<Node*> q;
q.push(root);
while(!q.empty()){
int size = q.size();
for(int i=0; i<size; i++){
Node *curr = q.front();
q.pop();
if(curr->left) q.push(curr->left);
if(curr->right) q.push(curr->right);
if(i==0) cout<<curr->data;
}
}
}
int main(){
struct Node *root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
root->left->left = new Node(4);
root->left->right = new Node(5);
root->right->left = new Node(6);
root->right->left->left = new Node(9);
root->right->right = new Node(7);
leftView(root);
}
解决方案
那里的代码确实有不同的行为:
int size = q.size();
for(int i=0; i<size; i++)
for(int i=0; i<q.size(); i++)
第一个版本有一定的循环大小:当前队列的大小。第二个具有动态循环大小,它不是确定性的,因为在循环中我们可能会从队列中推入或弹出元素,然后每次我们评估q.size
时,我们都会得到不同的大小。所以第二个版本大多是错误的和无用的。
你的代码实现了二叉树的层级旅行,对于每一层,需要访问的节点是当前队列的大小,所以第一个版本给了我们正确的答案。
推荐阅读
- javascript - 验证最小值不超过 Angular 应用程序中提供的最大值
- python - 如何在 django 模板中显示选择下拉值?
- docker - 如何使用 docker compose 将主机目录挂载为 docker 容器中的卷
- java - 在全屏android中使用recyclerview幻灯片图像
- python - 如何使用 python 从 www.immoweb.be(比利时房地产平台)中抓取数据?
- python - 使用 Seaborn relplot 和赛璐珞的动画
- excel - VBA 值大于 x 天 x 小时
- latex - 在方程中使用 itemize
- algorithm - 关于max-heapify时间复杂度的一个问题
- rabbitmq - 在具有多核 c 的单个服务器上运行多个 Rabbitmq 实例