我试图从图的DFS遍历中获取树木的向量,但是结果从函数返回后会改变。
这是Tree类:
template <typename T>
class Tree
{
public:
T v; // value of current node
// List of subtrees
std::list<Tree<T>*> children;
// Pointer to parent
Tree<T> *parent;
Tree(T v) {
this->v = v;
}
}
这是函数的相关部分
for (int i = 0; i < V; ++i)
trees.push_back(Tree<T>(info[i]));
int parent, node;
std::vector<int> roots;
for (int i = 0; i < V; ++i) {
parent = parents[i];
node = path[i];
if (parent != -1) {
trees[parent].children.push_back(&trees[node]);
trees[node].parent = &trees[parent];
}
else {
roots.push_back(node);
}
}
for(int node_i : roots)
res.push_back(trees[node]);
return res;
和变量声明如下:
template <typename T>
std::vector<Tree<T>> DFSTree(std::vector<T> &info) {
std::vector<Tree<T>> res;
std::vector<int> path;
std::vector<int> parents;
std::vector<Tree<T>> trees;
结果向量的子级中的Tree没有设置任何子级。 抱歉,这是一个基本问题,但我在任何地方都找不到答案。 谢谢您的回复
答案 0 :(得分:0)
您的Tree
类中有指针。当您使用res.push_back(trees[node])
复制树节点时,子指针和父指针仍指向trees
,而不是res
。函数返回后,trees
超出范围,并且其内存被释放,res
中的指针指向已删除的内存。
解决方法是重新考虑设计,以免使用指针。