我的DFS树的意外结果(C)
作者:互联网
我已经解决了这个问题!我发现如果我必须使用vector< Node *>孩子;.但我不太确定原因,有人可以告诉我为什么吗?谢谢:)
题:
我使用test.cpp生成一个树结构,如:
(ROOT-> children).size()的结果是2,因为root有两个子节点.
((ROOT-> children; [0] .children).size()的结果应为2,因为root的第一个子节点有两个子节点.但答案是0,为什么?这对我来说真的很困惑.
test.cpp (This code is runnable in visual studio 2010)
#include <iostream>
#include <vector>
using namespace std;
struct Node {
int len;
vector<Node> children;
Node *prev;
Node(): len(0), children(0), prev(0) {};
};
class gSpan {
public:
Node *ROOT;
Node *PREV;
void read();
void insert(int);
};
int main() {
gSpan g;
g.read();
system("pause");
}
void gSpan::read() {
int value[4] = {1, 2, 2, 1};
ROOT = new Node();
PREV = ROOT;
for(int i=0; i<4; i++) {
insert(value[i]);
}
cout << "size1: " << (ROOT->children).size() << endl; // it should output 2
cout << "size2: " << ((ROOT->children)[0].children).size() << endl; // it should output 2
system("pause");
}
void gSpan::insert(int v) {
while(v <= PREV->len)
PREV = PREV->prev;
Node *cur = new Node();
cur->len = v;
cur->prev = PREV;
PREV->children.push_back(*cur);
PREV = cur;
}
解决方法:
问题是你的子矢量包含节点值而不是节点*指针.当您的访问权限正确使用root时,它只会找到您尝试维护的子项的副本.您的所有节点也都泄露了.
您可能想要使用std :: vector< Node *>为您的孩子,并在某些时候删除它们.最简单的方法可能是使用智能指针向量,例如:一个teference计数指针,并让智能指针处理释放.
标签:depth-first-search,c,algorithm,tree 来源: https://codeday.me/bug/20191003/1848040.html