我有一個後綴樹,這棵樹的每個節點是一個結構深度優先搜索
struct state {
int len, link;
map<char,int> next; };
state[100000] st;
我需要爲每個節點DFS和得到,我可以接觸到所有的字符串,但我不知道如何製作。 這是我的DFS功能
void getNext(int node){
for(map<char,int>::iterator it = st[node].next.begin();it != st[node].next.end();it++){
getNext(it->second);
}
}
這將是完美的,如果我能像
map<int,vector<string> >
其中int是我的樹和矢量串的節點,我可以達到
現在它的工作原理
void createSuffices(int node){//, map<int, vector<string> > &suffices) {
if (suffices[sz - 1].size() == 0 && (node == sz - 1)) {
// node is a leaf
// add a vector for this node containing just
// one element: the empty string
//suffices[node] = new vector<string>
//suffices.add(node, new vector<string>({""}));
vector<string> r;
r.push_back(string());
suffices[node] = r;
} else {
// node is not a leaf
// create the vector that will be built up
vector<string> v;
// loop over each child
for(map<char,int>::iterator it = st[node].next.begin();it != st[node].next.end();it++){
createSuffices(it->second);
vector<string> t = suffices[it->second];
for(int i = 0; i < t.size(); i ++){
v.push_back(string(1,it->first) + t[i]);
}
}
suffices[node] = v;
}
}
爲什麼要使用地圖,你想這對每個節點所以只要矢量指針的載體。無論哪種方式,你都會有相當多的冗餘。 –
Leeor
我認爲檢查一片葉子是錯誤的。如果一個節點沒有子節點,那麼它就是一個葉子,也就是說,如果'next'是一個空映射。我不知道上面的代碼片段中有什麼'sz',但它看起來不正確。 –