【发布时间】:2016-11-16 20:08:43
【问题描述】:
我有一个简单的算法,它返回一个列表列表,其中每个内部列表包含二叉树不同级别的节点。我无法理解如何“重置”我的内部列表的范围(例如,见下文)。
我的树是一棵简单的玩具树,如下所示:
struct Node {
int data;
Node *left, *right;
}
我使用了一个简单的 bfs,它应该返回一个列表列表。我尝试在每个循环上创建一个新列表,但我不确定如何“清除”列表并开始一个新列表。
std::vector< std::vector<Node *> > build_lists(Node *root) {
std::vector< std::vector<Node *> > result;
Node *newline = new Node { std::numeric_limits<int>::min(), nullptr, nullptr };
std::deque<int> q;
q.push_back(root);
q.push_back(newline);
Node *tmp;
std::vector<Node *> inner; // HERE IS WHERE IS SET THE FIRST INNER VECTOR
while(!q.empty()) {
tmp = q.front();
q.pop_front();
if (tmp == newline) {
result.push_back(inner);
std::vector<Node *> inner; // HERE IS WHERE I TRY TO ''RESET'' THE VECTOR
if (!q.empty())
q.push_back(newline);
} else {
inner.push_back(tmp);
if (tmp->left)
q.push_back(tmp->left);
if (tmp->right)
q.push_back(tmp->right);
}
}
}
显然,我没有理解范围和一些基本的语言特性。如果有人能帮助我指出正确的方向,我将不胜感激。
【问题讨论】:
-
没有投反对票。通过列表,您的意思是
inner? -
@gsamaras 是的。抱歉,我猜这里是矢量。
-
声明第二个对象名称“inner”对第一个对象没有任何作用——它只是意味着堆栈上有两个同名对象(在C ++,但通常不赞成,因为它会引起混乱)。要重置矢量,您应该改为调用 inner.clear();
-
@JeremyFriesner 我猜这是个愚蠢的问题,但为什么
inner.clear()不清除我推到result向量上的向量? -
因为 push_back 制作了 inner 的副本并将该副本推送到结果向量中。 (C++ 与 Java 等其他语言的不同之处在于,Java 中的所有内容都通过引用传递;在 C++ 中,您通常也按值传递对象,这涉及制作对象的副本)
标签: c++ c++11 vector scope breadth-first-search