作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写文件系统层次结构的 N 元树表示,其中包含有关目录/文件的一些信息。树中的每个节点都包含一个父节点及其子节点列表(如果有),并且包含在单独的 Tree 对象中。据我所知,这不是实现树的最 Eloquent 方法,但我已经深入到这个项目了,不值得回去。
public class TreeNode {
private FileSystemEntry data;
private TreeNode parent;
private ArrayList<TreeNode> children;
private boolean directory; //separates files from folders (files have no children)
树结构被定义为它自己的单独对象,因为会有几棵树。
public class DirectoryTree {
private TreeNode Root;
private int numNodes;
private TreeNode Focus;
我知道我需要使用队列来添加每个节点,同时遍历它的子节点(或类似的东西)。
这是一个深度优先递归解决方案,它打印每个文件/目录的名称,仅供引用。
public void PrintTreeNames() {
PrintTreeNames(this.Root);
}
private void PrintTreeNames(TreeNode n) {
if (!n.isDirectory()) {
System.out.println(n.getData().getName());
} else {
for (int i = 0; i < n.getChildren().size(); i++) {
PrintTreeNames(n.getChildren().get(i));
}
System.out.println(n.getData().getName());
}
}
我觉得从深度优先到广度优先应该只需要一个小小的修改,但我似乎无法理解它
最佳答案
最初仅使用根节点创建队列,处理队列直到其为空。要首先处理节点输出,然后将其所有子节点添加到队列中:
public void PrintTreeNames() {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(this.root);
TreeNode current;
while ((current = queue.poll()) != null) {
PrintTreeNames(current, queue);
}
}
private void PrintTreeNames(TreeNode n, Queue<TreeNode> queue) {
System.out.println(n.getData().getName());
if (n.isDirectory()) {
for (int i = 0; i < n.getChildren().size(); i++) {
queue.add(n.getChildren().get(i));
}
}
}
关于java - 广度优先 N 叉树遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43021126/
所以我有一个有向图,我添加了顶点和边。该图表示机场和它们之间的航类。当我运行广度优先或深度优先搜索以找到两个机场之间的路径时,我第一次得到了正确的答案,但是当我第二次使用完全相同的机场运行它时,它找不
我是一名优秀的程序员,十分优秀!