2009-09-24 3 views
14

У нас есть древовидная структура, реализованная с использованием DefaultMutableTreeNode, указанного в Java.Дерево обхода из DefaultMutableTreeNode

Есть ли способ его пересечения, который встроен?

Если нет, предложите другие методы.

+0

Что вы понимаете, анализируя его? Как правило, вы должны анализировать выражение для построения внутреннего представления (например, древовидной структуры, которую вы уже имеете). Вы просто хотите пересечь дерево? – Adamski

+0

Извините за это. Да, я имел в виду пересечь его. – fixxxer

ответ

14

Если вы хотите пройтись по дереву, вы можете позвонить 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(); 
} 
+0

Как получить доступ к каждому узлу, который был возвращен алгоритмом поиска? Можете ли вы указать мне хороший ресурс, пожалуйста. – fixxxer

+0

Я только что добавил пример кода. – Adamski

+0

Наконец-то мне нужно! Я использовал ArrayList, который добавил к ним узлы, поскольку я их создал, и это было хорошо, но поскольку я использую дублированные записи в разных папках, мне нужен новый массив для каждой папки, а затем он становится очень быстрым. Кроме того, благодаря ответу ниже я могу обрабатывать их в 2 раза быстрее! – Daedric

0

Правильно, breadtFirst является Симметричным. Предзаказ (первый корень, то дети) также поддерживается (preorderEnumeration)

16

Вы теоретически четыре способа обхода дерева от узла (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
Leaf SF1, Leaf SF1, подпапка 1
Лист SF 2, Leaf SF2, Суб-папка 2 , Папка 2, Root
♦ BreathFirst:
Root
Folder 1, Папка 2
Лист F1, Лист F1, Суб-папки 1, Суб-папка 2
Лист SF 1, Лист SF 1, Лист SF 2 , Leaf SF 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. 
+0

Первоначально я не сказал, что я имел в виду, я имел в виду это как визуализацию, но я случайно сказал это буквально. Я изменил его сейчас, надеюсь, это более понятно, спасибо за отзывы. – neokyle

Смежные вопросы