遍历由DefaultMutableTreeNode构成的树

fix*_*xer 17 java tree swing parsing

我们使用DefaultMutableTreeNodeJava中指定的树结构.

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

如果没有,请提出其他技巧.

Ada*_*ski 17

如果您的意思是想要遍历树,则可以调用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();
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*Lho 17

从理论上讲,有四种方法可以从节点(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]);
  }
Run Code Online (Sandbox Code Playgroud)

我可以通过与水平成比例的缩进来改进,但它只是一个快速的黑客.

那么,有什么区别?

  • 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
Run Code Online (Sandbox Code Playgroud)

♦预购:如上所示
♦DepthFirst/Postorder:
Leaf F1,Leaf F1,Folder 1
Leaf SF1,Leaf SF1,Sub-folder 1
Leaf SF 2,Leaf SF2,Sub-folder 2,Folder 2,Root
♦BreathFirst:
Root
Folder 1,文件夹2
叶F1,叶F1,子文件夹1,子文件夹2
叶SF 1,叶SF 1,叶SF 2,叶SF 2