我的DFS树的意外结果(C ++)

时间:2012-03-20 03:23:30

标签: c++ algorithm tree depth-first-search

我已经解决了这个问题!!!我发现如果我必须使用vector<Node*> children;。但我不太确定原因,有人可以告诉我为什么吗?感谢:)

问题:

我使用test.cpp生成树结构,如:

enter image description here

(ROOT->children).size()的结果为2,因为root有两个孩子。

((ROOT->children)[0].children).size()的结果应为2,因为root的第一个孩子有两个孩子。但答案是0,为什么?这对我来说真的很困惑。

  

test.cpp(此代码可在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;

}

1 个答案:

答案 0 :(得分:3)

问题是,children向量包含Node个值而不是Node*个指针。当您的访问权限正确使用root时,它只会找到您尝试维护的子项的副本。你的所有节点也都泄露了。

您可能希望为您的孩子使用std::vector<Node*>,并在某些时候使用delete。最简单的方法可能是使用智能指针向量,例如:一个teference计数指针,并让智能指针处理释放。