编程语言
首页 > 编程语言> > java-深度优先搜索列表路径到所有末端节点

java-深度优先搜索列表路径到所有末端节点

作者:互联网

嗨,我有一棵树,我想在其中获得从初始(根)节点到所有叶子的路径.

我发现了几个算法,列出了图中任何给定的两个节点之间的(所有)顶点(例如,以下SO问题:
Graph Algorithm To Find All Connections Between Two Arbitrary Vertices)

对于二叉树,也存在一种算法
http://techieme.in/print-all-paths-in-a-tree/
但我在具有各种分支因子的树上工作.

除了遍历树以获取所有叶子然后针对与初始节点组合的所有叶子运行以上算法之外,还有什么更好的方法可以实现我想做的事情?

我正在考虑实现简单的DFS,并通过一些附加的堆栈扩展该堆栈,该堆栈包含指向单个叶子的路径的所有节点,然后通过遍历这些堆栈列出所有语句.

    ArrayList<GrammarNode> discovered = new ArrayList<GrammarNode>();
    Stack<GrammarNode> S = new Stack<GrammarNode>();


    while (!S.empty()) {
        node = S.pop();
        if (!discovered.contains(node)) {
            discovered.add(node);
            System.out.println(node.getWord.getSpelling().trim());
            for (GrammarArc arc : node.getSuccessors()) {
                S.push(arc.getGrammarNode());
            }
        }
    }

更新:
这样的问题是,为了产生完整的句子,人们不得不退回到词根.所以我想问题是:如何记住已经被完全访问过的节点(这意味着已经探索了所有子节点的位置)?

解决方法:

打印从根到每片叶子的所有路径将意味着打印整个树,因此我只需要使用一个简单的DFS并对每个节点执行以下操作:

>将其添加到列表/堆栈
>如果节点有子节点,则为子节点重复
>如果节点是叶子,则打印列表/堆栈
>从列表/堆栈中弹出节点

例:

   A
  / \
 B   E
/ \ / \
C D F G

第一步如下所示:

>将A放在列表中-> {一种}
>将B放在列表中-> {A,B}
>将C放在列表中-> {A,B,C}
>因为C是叶子,所以打印列表(A,B,C)
>从列表中删除C-> {A,B}
>将D放在列表中-> {A,B,D}
>因为D是叶子,所以打印列表(A,B,D)
> …

标签:graph-algorithm,java
来源: https://codeday.me/bug/20191121/2052769.html