Depth first search list paths to all end nodes(深度优先搜索列出指向所有末端节点的路径)
问题描述
您好,我有一棵树,我想在其中获取从初始(根)节点到所有叶子的路径。 我找到了几个算法,它们列出了图中任意给定两个节点之间的(所有)路径(例如,这样的问题: 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放在列表上->{A}
- 把B放在名单上->{A,B}
- 将C放在列表上->{A,B,C}
- 因为C是叶子,所以打印列表(A、B、C)
- 从列表中删除C->{A,B}
- 将D放在列表上->{A,B,D}
- 因为D是叶子,所以打印列表(A、B、D)
- ...
这篇关于深度优先搜索列出指向所有末端节点的路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:深度优先搜索列出指向所有末端节点的路径
基础教程推荐
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01