我正在编码文件系统层次结构的N元树表示形式,其中包含有关目录/文件的一些信息。树中的每个节点都包含一个父节点及其子列表(如果有),并包含在单独的Tree对象中。就我所知,这不是实现树的最雄辩的方法,但是我对项目不了解,因此不值得再谈。
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));
}
}
}