【发布时间】:2016-06-17 18:08:05
【问题描述】:
我最初有这个用于拓扑排序的递归解决方案:
void dfs(int v, bool visited[], node* adjList[], std::stack<int> &myStack) {
visited[v] = true;
node* curr = adjList[v];
while (curr != NULL) {
if(!visited[curr->val]) {
dfs(curr->val, visited, adjList, myStack);
}
curr = curr->next;
}
myStack.push(v);
}
它似乎对我的目的有效。但是我在将其转换为迭代解决方案时遇到了麻烦。这是我的尝试:
void dfs(int v, bool visited[], node* adjList[], std::stack<int> &myStack) {
std::stack<int> recursion;
visited[v] = true;
recursion.push(v);
while( !recursion.empty() ) {
v = recursion.top();
recursion.pop();
node* curr = adjList[v];
myStack.push(v);
while (curr != NULL) {
if(!visited[curr->val]) {
visited[curr->val] = true;
recursion.push(curr->val);
}
curr = curr->next;
}
}
}
但是顺序完全乱了!我认为这可能是由于我的myStack.push(v) 的定位,但我不知道如何处理这个问题。任何帮助将不胜感激。
【问题讨论】:
-
我在过去的几天里想,诀窍通常是反转递归退出条件并将其用于非递归函数的 while 条件。然后,我推测,您可以保留大部分旧逻辑。
-
@BitTickler 你这是什么意思?
-
主要区别在于递归中
visited的状态不同,而在迭代版本中你只修改一个这样的列表,并且在回溯时取消设置visited。
标签: c++ recursion graph depth-first-search topological-sort