遍历由默认创建的树可变树节点

2022-09-02 20:01:42

我们有一个使用Java中指定的树结构实现的树结构。DefaultMutableTreeNode

有没有办法遍历它,这是内置的?

如果没有,请建议其他技术。


答案 1

从理论上讲,您有四种方法可以从节点()遍历树:DefaultMutableTreeNode

  • breadthFirstEnumeration
  • depthFirstEnumeration
  • preorderEnumeration
  • postorderEnumeration

但实际上深度优先是作为后序实现的。
JavaDoc在这些方法的差异上有点简洁。我来这里寻找答案,但我以自己做测试结束,代码看起来像这样:

  TreeModel model = tree.getModel();

  DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) model.getRoot();
  // Just changing enumeration kind here
  Enumeration<DefaultMutableTreeNode> en = rootNode.preorderEnumeration();
  while (en.hasMoreElements())
  {
     DefaultMutableTreeNode node = en.nextElement();
     TreeNode[] path = node.getPath();
     System.out.println((node.isLeaf() ? "  - " : "+ ") + path[path.length - 1]);
  }

我本可以用与级别成比例的缩进进行改进,但这只是一个快速的黑客攻击。

那么,有什么区别呢?

  • preorderEnumeration=从树的顶部到底部,就好像你用向下箭头走过它一样
  • postorderEnumeration = depthFirstEnumeration=首先列出第一条路径中最深的叶子,然后是它们的父级,然后是第二条路径的最深的叶子,依此类推。
  • breadthFirstEnumeration= 列出第一级的元素,然后列出第二级的元素,依此类推

更具体地说:

+ Root
  + Folder 1
    - Leaf F1
    - Leaf F1
 + Folder 2
    + Sub-folder 1
      - Leaf SF1
      - Leaf SF1
    + Sub-folder 2
      - Leaf SF2
      - Leaf SF2

♦ 预购:如上
♦所示 深度第一/后订:
叶 F1、叶 F1、文件夹 1
叶 SF1、叶 SF1、子文件夹 1
叶 SF 2、叶 SF2、子文件夹 2、文件夹 2、根
♦呼吸第一:

文件夹 1、文件夹 2
叶 F1、叶 F1、子文件夹 1、子文件夹 2
叶 SF 1、叶 SF 1、叶 SF 2、叶 SF 2


答案 2

如果你的意思是你想遍历树,你可以调用或为了迭代树中的所有节点。breadthFirstEnumeration()depthFirstEnumeration()

例:

DefaultMutableTreeNode root = ...

Enumeration en = root.depthFirstEnumeration();
while (en.hasMoreElements()) {

  // Unfortunately the enumeration isn't genericised so we need to downcast
  // when calling nextElement():
  DefaultMutableTreeNode node = (DefaultMutableTreeNode) en.nextElement();
}

推荐