gpt4 book ai didi

java - 广度优先 N 叉树遍历

转载 作者:行者123 更新时间:2023-11-30 02:36:10 25 4
gpt4 key购买 nike

我正在编写文件系统层次结构的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com