遍历由DefaultMutableTreeNode构成的树

时间:2009-09-24 10:32:22

标签: java swing parsing tree

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

有没有办法穿越它,那是内置的?

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

4 个答案:

答案 0 :(得分: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]);
  }

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

那么,有什么区别?

  • 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

♦预购:如上图所示 ♦DepthFirst / Postorder:
叶F1,叶F1,文件夹1
叶SF1,叶SF1,子文件夹1
叶SF 2,叶SF2,子文件夹2,文件夹2,根
♦BreathFirst:

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

答案 1 :(得分:15)

如果您想要遍历树,可以调用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();
}

答案 2 :(得分:1)

这是3个枚举方法的另一个描述,可能更容易理解。

en = root.breadthFirstEnumeration();
//Enumeration lists all nodes at depth 0 (aka root)
//Then all nodes at depth 1 (aka root's children, top to bottom ordering)
//Then all nodes at depth 2, and so on till max depth reached

en = root.preorderEnumeration(); 
//Imagine your JTree is fully expanded (where each node = a row)
//Enumeration will list nodes from top to bottom (regardless of leaf or not)

en = root.postorderEnumeration(); //Equivalent to root.depthFirstEnumeration();
//Imagine a fully expanded copy of your JTree (where each node = a row)
//This will allow you to visualize what Enumeration List will look like
while(treecopy.hasNodes() ) {
list 1st leaf sighted going from top to bottom, then remove that leaf }
//as the leafs are removed, branches then become leafs, and root is last enumerated.

答案 3 :(得分:0)

正确,breadtFirst是有序的。也支持预购(第一个根,然后是儿童)(preorderEnumeration)