2009-09-24 11 views
14

Mamy strukturę drzewa zaimplementowaną przy użyciu parametru DefaultMutableTreeNode określonego w Javie.Drzewo ruchu wykonane z DefaultMutableTreeNode

Czy istnieje sposób na przemierzanie go, to jest wbudowany?

Jeśli nie, proszę sugerować inne techniki.

+0

Co masz na myśli, parsując go? Zazwyczaj parsujesz wyrażenie, aby zbudować reprezentację wewnętrzną (taką jak struktura drzewa, którą już posiadasz). Czy chcesz po prostu przejść przez drzewo? – Adamski

+0

Przepraszam za to. Tak, miałem na myśli przemierzanie tego. – fixxxer

Odpowiedz

14

Jeśli chcesz przejść przez drzewo, możesz zadzwonić pod numer breadthFirstEnumeration() lub depthFirstEnumeration(), aby wykonać iterację po wszystkich węzłach w drzewie.

przykład:

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

Jak uzyskać dostęp do każdego węzła, który został zwrócony przez algorytm wyszukiwania? Czy możesz wskazać mi dobry zasób? – fixxxer

+0

Właśnie dodałem przykładowy kod. – Adamski

+0

Wreszcie to, czego potrzebowałem! Używałem ArrayList, do którego dodałem węzły, ponieważ je utworzyłem, co było w porządku, ale ponieważ używam zduplikowanych wpisów w różnych folderach, potrzebowałem nowej tablicy dla każdego folderu, a następnie szybko się rozrasta. Również dzięki poniższej odpowiedzi mogę przetworzyć je 2 razy tak szybko! – Daedric

0

Prawidłowe, breadtFirst jest Inorder. Preorder (pierwsza korzeń, potem dzieci) jest obsługiwany, jak również (preorderEnumeration)

16

Masz teoretycznie cztery sposoby chodzić drzewo z węzła (DefaultMutableTreeNode):

  • breadthFirstEnumeration
  • depthFirstEnumeration
  • preorderEnumeration
  • postorderEnumeration

, ale w rzeczywistości pierwszy jest realizowany jako postorder.
JavaDoc jest nieco lakoniczny na temat różnic w tych metodach. Przybyłem tu w poszukiwaniu odpowiedzi, ale skończyło wykonując sprawdzić się z kodem patrząc jak:

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

mogłem rafinowany z wcięciem proporcjonalny do poziomu, ale to było tylko szybkie Hack.

Jakie są różnice?

  • preorderEnumeration = od górnej części drzewa do dołu, jakbyś za pomocą strzałki w dół, aby chodzić
  • postorderEnumeration = depthFirstEnumeration = pierwsza lista najgłębsze listkami pierwszej ścieżce, wówczas ich rodziców, a najgłębsza liście drugiej ścieżki itp.
  • breadthFirstEnumeration = Lista elementów na pierwszym poziomie, a następnie przez elementy na jego drugim poziomie, a więc na

Bardziej beton

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

♦ Zamówienie wstępne: tak jak pokazano powyżej
♦ DepthFirst/Postorder:
Leaf F1, Leaf F1, Folder 1
Leaf SF1, Leaf SF1, Sub-folder 1
Leaf SF 2, Leaf SF2, Subfolder 2 , Katalog 2 Root
♦ BreathFirst:
głównej
katalogu 1, katalog 2
liści F1 liści F1 podfolderów jeden Sub-katalog 2
liści SF 1, liść SF 1, liść SF 2 , Leaf SF 2

1

Oto kolejny opis 3 metod wyliczeniowych, które mogą być łatwiejsze do zrozumienia.

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

Początkowo nie powiedziałem, co mam na myśli, miałem na myśli jako pomoc w wizualizacji, ale przypadkowo powiedziałem to dosłownie. Zmieniłem go teraz, mam nadzieję, że jest bardziej zrozumiały, dzięki za opinie. – neokyle