首页 文章

广度优先的N-ary树遍历

提问于
浏览
0

我正在编写文件系统层次结构的N-ary树表示,其中包含有关目录/文件的一些信息 . 树中的每个节点都包含父节点及其子节点列表(如果有),并包含在单独的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;

我明白,当我遍历其子节点(或类似的东西)时,我将需要使用队列来添加每个节点 .

这是一个Depth第一个递归解决方案,它打印每个文件/目录的名称,仅供参考 .

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());
    }

}

我觉得它应该只是一个小的修改,从第一个深度到第一个宽度,但我似乎无法绕过它

1 回答

  • 1

    最初只使用根节点创建队列,处理队列直到它为空 . 要处理节点首先输出它,然后将其所有子节点添加到队列中:

    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));
        }
      }
    }
    

相关问题