2008-12-03 22 views
5

Powiedziano mi, że TreeMap klasy Java używa implementacji drzewa RB. Jeśli tak, to w jaki sposób wykonuje się drzewo genealogiczne w ramach zamówienia, preorder i postorder treeMap?Opcje sortowania Java TreeMap?

Czy to nie jest możliwe?

Odpowiedz

6

Nie można tego zrobić z mapą drzewa zaimplementowaną w bibliotece kolekcji. Oto implementacja Red-Black Tree w Javie, na którą możesz jednak spojrzeć. Sprawdź metody printTree(), aby zobaczyć, w jaki sposób poruszają się po drzewie w posortowanej kolejności.

/** 
* Print all items. 
*/ 
public void printTree() { 
    printTree(header.right); 
} 

/** 
* Internal method to print a subtree in sorted order. 
* @param t the node that roots the tree. 
*/ 
private void printTree(RedBlackNode t) { 
    if(t != nullNode) { 
     printTree(t.left); 
     System.out.println(t.element); 
     printTree(t.right); 
    } 
} 

Od który może można napisać swoje własne metody przemierzać drzewa we wszystkich trzech zamówień.

3

AFAIK klasy TreeSet/TreeMap nie ujawniają żadnych swoich wewnętrznych elementów i są po prostu zgodne z interfejsem Set/Map. Iterator ma tylko gwarantowaną kolejność.

jestem trochę zakłopotany, aby dlaczego chcesz zeskanować te węzły w Inorder ponieważ celem tych drzew nie jest do reprezentowania relacji między obiektami (np formuł matematycznych), ale tylko do przechowywania wszystkich z nich i odzyskaj je sprawnie.

+0

To bardziej kwestia teorii niż aplikacji. – kylex

+0

Witam @Uri, RB Drzewa zawsze zachowują równowagę, niezależnie od kolejności włożenia kluczy, prawda? Więc czy słuszne jest założenie, że jeśli wstawimy klucze do TreeMap w zdegenerowany sposób, czas wyszukiwania i wstawiania będzie wynosił 'O (log N)'? – SexyBeast

3

Można przynajmniej zrobić spacer Inorder pomocą iteratora oraz dla każdej pętli:

void inOrderWalk(TreeMap<K,V> treeMap) { 
    //this will loop through the values in the map in sorted order (inorder traversal) 
    for (Map.Entry<K,V> entry : treeMap.entrySet() { 
     V value = entry.getValue(); 
     K key = entry.getKey() 
    } 
} 

Jednakże inne plakaty rację: Java nie narazić którejkolwiek z mechaniki drzew, więc preorder lub postorder nie jest możliwy w tym widoku.