我希望能够找到一些伪代码、算法或指导,以帮助我为广义图数据结构找到适当的迭代后序遍历算法。
我已经找到了很多资源(如使用两个栈或一个栈的算法),它们在树上运行得很好,但对于图来说就会出现问题,因为它们无法处理循环/反向边、交叉边等。
我已经成功编写了一个递归后序图遍历算法,它看起来像这样:
D,E,F,B,G,C,A
…我的递归算法确实提供了正确的结果。
然而,尝试将其转换为迭代算法一直是困难的,我自己也没有成功。我尝试将其转换为尾递归,以便可以转换为迭代,但我无法弄清楚。我还尝试将基于树的两个堆栈和一个堆栈算法转换,但在那里也无法正确复制结果。
我看到类似的堆栈溢出问题,但没有涵盖实际迭代算法、伪代码或递归到迭代转换的问题,因此任何对该方向的指导都将真正有助于解决问题。
提前感谢。
我已经找到了很多资源(如使用两个栈或一个栈的算法),它们在树上运行得很好,但对于图来说就会出现问题,因为它们无法处理循环/反向边、交叉边等。
我已经成功编写了一个递归后序图遍历算法,它看起来像这样:
template<typename V, typename E>
void tGraph<V, E>::RecursivePostOrderSearch(const tGraph& g, const VertexType& u, std::set<VertexType>& visited, std::vector<VertexType>& result)
{
if (visited.find(u) == visited.end())
{
visited.insert(u);
EdgeSet edgesOut = g.outgoingEdgesOf(u);
for(typename EdgeSet::const_iterator iter = edgesOut.begin(); iter != edgesOut.end(); iter++)
{
RecursivePostOrderSearch(g, iter->second.second, visited, result);
}
result.push_back(u);
}
}
template<typename V, typename E> std::vector<V> tGraph<V, E>::postOrderList(const VertexType& v) const
{
std::set<V> visited;
std::vector<V> result;
RecursivePostOrderSearch(*this, v, visited, result);
return result;
}
其中V
是节点类型,E
是边类型--包含"权重"和入/出节点对。
如果我在以下图表上运行::postOrderList
(根节点为A
):
D,E,F,B,G,C,A
…我的递归算法确实提供了正确的结果。
然而,尝试将其转换为迭代算法一直是困难的,我自己也没有成功。我尝试将其转换为尾递归,以便可以转换为迭代,但我无法弄清楚。我还尝试将基于树的两个堆栈和一个堆栈算法转换,但在那里也无法正确复制结果。
我看到类似的堆栈溢出问题,但没有涵盖实际迭代算法、伪代码或递归到迭代转换的问题,因此任何对该方向的指导都将真正有助于解决问题。
提前感谢。