假设我们有字符串ABCD
我想创建以下树:
ABCD <------ level 1
ABC ABD ACD BCD <------ level 2
AB AC AD BC BD CD <------ level 3
A B C D <------ level 4
并按以下顺序将其保存在向量中:
ABCD->ABC->ABD->ACD->BCD->AB->AC->AD->BC->BD->CD->A->B->C->D
所以从起点开始,我想生成下一层的节点,将它们存储在向量中,然后生成下一层的节点并对所有剩余的层做同样的事情
我创建了以下程序来从级别 1 生成级别 2。
void test(int dimensions, vector<string> & nodes, const char* currentNode){
int i,j;
for(i=dimensions-1;i>=0;i--){
char *temp = new char[dimensions];
int counter = 0;
for(j=0;j<dimensions;j++){
if(j!=i){
temp[counter] = currentNode[j];
counter++;
}
}
temp[counter] = '\0';
nodes.push_back(temp);
}
}
从 main 调用:
vector<string> nodes;
int dimension = 4;
nodes.push_back("ABCD");
test(dimension, nodes, "ABCD");
这给了我以下信息:
如您所见,级别 2 的节点已成功添加,但是如果我尝试在此处应用递归,例如节点“ABC”
结果我会得到:
AB -> AC -> BC
这些将成功保存,但是如果递归继续进行,例如对于 node AB
now 它会找到A -> B
所以保存在向量中的节点的结果顺序不会是我一开始描述的方式。
代替
ABCD->ABC->ABD->ACD->BCD->AB->AC->AD->BC->BD->CD->...
这将是
ABCD->ABC->ABD->ACD->BCD->AB->AC->A->B->...
最后,我希望将这棵树的计算推广到任意数量的维度。例如,初始节点可以是ABCD
或ABCDEFGHIJKLM
。
出于某种原因,我认为这很难做到,但是我不确定。请注意,我不想使用任何外部库来计算排列,我需要 100% 理解代码才能继续执行我想要实现的算法。
先感谢您