2011-02-12 10 views
5

Aktualnie implementuję drzewo zakresu 2D. Mam problem z wymyśleniem wiarygodnego modelu (w języku Java) dla mojej klasy węzła.Modelowanie węzła w zakresie RangeTree

Węzeł w drzewie może mieć dowolną z następujących wartości: wartość środkową, prawy i lewy wskaźnik podrzędny, poddrzewo, wskaźnik danych i/lub poprzednie i następne wskaźniki.

Mam podziale Node w trzech oddzielnych elementów logicznych

  • a) Węzeł tylko z wartości średniotonowy - każdy węzeł ma średniotonowy
  • b) węzeł o punkty w lewo, w prawo i poddrzewa. Reprezentuje to węzeł inny niż liść.
  • c) Nie z następnymi, poprzednimi i wskaźnikami danych. Reprezentuje to węzeł liścia.

Próbowałem zastosować wzory kompozytowe i dekoracyjne, ale na próżno. Próbowałem dokonywania:

  1. interfejs Node ze wszystkich możliwych pobierające/ustawiające, a mianowicie: getMidRange, getLeft, GetRight, setLeft, setRight, etc ...
  2. Posiadające dwie klasy implementują interfejs: Node2D i LinkedNode (węzeł liścia). Node2D zrobił wszystko, z wyjątkiem utrzymywania linków do następnych i poprzednich. Podczas, gdy LinkedNode utrzymywał tylko linki do następnych i poprzednich.

To działa tak, ale wędrowałem, czy istnieje lepszy sposób modelowania tego jako zestawu klas?

EDIT: Drzewo zakresów (krótkie informacje): W drzewach zakresu - wszystkie dane są przechowywane w węzłach liści, a drzewo jest zawsze zrównoważone. Ponadto wszystkie liście są na tej samej wysokości. Liście są również sortowane i łączone razem przez podwójnie połączoną listę. Ostatni, ale nie najmniej, każdy węzeł inny niż liść ma poddrzewo - które jest także drzewem zasięgu, ale z liśćmi posortowanymi według następnego atrybutu (np. y, jeśli oryginalne drzewo zostało posortowane na x).

RangeTreeBreakdown

+1

Jeśli węzły nie przełączać się między liści i innych liści statusu jako struktura ewoluuje, chciałbym mieć pokusę, aby utworzyć klasę abstrakcyjną z A z B i C są jego dwa konkretne podklasy. Jeśli, tak jak w drzewie wyszukiwania binarnego, węzeł jest liściem tylko dlatego, że obecnie nie ma dzieci, ale może później uzyskać dzieci, użyłbym jednej klasy. Nie widzę tu żadnych znaczących wzorców, ponieważ nie ma interakcji, ale nie znam drzew zasięgu. –

+0

Tak, węzły nie przełączają się z liści na inne niż liście. Wszystkie dane są przechowywane w liście. Przepraszam, edytuję pytanie. – drozzy

Odpowiedz

1
abstract class AbstractNode { 
    int midRange; 
} 

class InnerNode extends AbstractNode { 
    AbstractNode left; 
    AbstractNode right; 
    AbstractNode subtree; 
} 

class LeafNode extends AbstractNode { 
    LeafNode next; 
    LeafNode prev; 
    Object data; 
} 
+0

Wygląda na to, co zrobiłem (ale z typowymi typami danych). @drozzy, czy jest jakiś problem z tym? –

+0

Nie, myślę, że to zadziała. Jest wiele sposobów na zrobienie tego i wydaje mi się, że jest to ściśle związane z kontekstem. – drozzy