2011-02-12 25 views
5

Actualmente me estoy poniendo en práctica un árbol Rango 2D. Tengo problemas para encontrar un modelo plausible (en Java) para mi clase Node.Modelado de un nodo en un RangeTree

Un nodo en el árbol puede tener cualquiera de los siguientes: el valor de rango medio, puntero del hijo derecho e izquierdo, subárbol, puntero de datos y/o punteros anterior y siguiente.

He roto el nodo en tres piezas lógicas separadas

  • a) Nodo con sólo valor de rango medio - cada nodo tiene un rango medio
  • b) Nodo con puntos de izquierda, derecha y de subárbol. Esto representa un nodo no hoja.
  • c) No con los punteros siguiente, anterior y de datos. Esto representa un nodo de hoja.

Intenté aplicar patrones de Compuesto y Decorador, pero fue en vano. Intenté hacer:

interfaz Node
  1. con todos los getters/setters posibles, es decir: getMidRange, getLeft, GetRight, setLeft, Setright, etc ...
  2. Tener dos clases implementan la interfaz: Node2D y LinkedNode (nodo de hoja). Node2D hizo todo excepto mantener los enlaces al siguiente y al anterior. Mientras que LinkedNode solo mantuvo enlaces al siguiente y al anterior.

Funciona así, pero yo estaba vagando si hay una manera más agradable de modelar esto como un conjunto de clases?

EDIT: Árbol de rango (información breve): en árboles de rango: todos los datos se almacenan en los nodos Hoja, y el árbol siempre está equilibrado. Además todas las hojas están a la misma altura. Además, las hojas están ordenadas y unidas por una lista doblemente vinculada. Por último, pero no menos importante, cada nodo no hoja tiene un sub-árbol - que es también un árbol de gama, pero con las hojas ordenados en el siguiente atributo (por ejemplo y árbol original si se solucionó en x).

RangeTreeBreakdown

+1

Si nodos no cambiar entre la hoja y no hoja condición de la estructura evoluciona, yo estaría tentado a crear una clase abstracta de A con B y C siendo sus dos subclases concretas. Si, como en un árbol de búsqueda binaria, un nodo es una hoja simplemente porque actualmente no tiene hijos pero puede tener hijos más adelante, usaría una única clase. No veo ningún patrón significativo aquí ya que no hay interacciones, pero no estoy familiarizado con los árboles de rango. –

+0

Sí, los nodos no cambian de hoja a hoja. Todos los datos se almacenan en las hojas. Perdón por eso, voy a editar la pregunta. – drozzy

Respuesta

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

Parece lo que hice (pero con tipos genéricos para datos). @drozzy, ¿hay algún problema con esto? –

+0

No, creo que esto funcionará. Hay muchas maneras de resolver esto, y creo que es muy específico del contexto. – drozzy