2012-07-01 16 views
5

Escribí esta clase de árbol n-array ahora quiero escribir un método para agregar un niño a un nodo específico en mi árbol de la manera que es: primero debería buscar el árbol para encontrar el padre y luego agregar el niño a ese nodo no sé cómo debo declarar mi métodoCómo agregar un elemento secundario a un nodo específico en el árbol n-array?

public class FamilyNode { 
    public String name; 
    public String Family; 
    public String sex; 
    public FamilyNode Father; 
    public FamilyNode Mother; 
    public FamilyNode Spouse=null; 
    public String status="alive"; 
    public int population; 
    public ArrayList<FamilyNode> children=new ArrayList<FamilyNode>() ; 


    public FamilyNode(String firstname,String lastname,String sex1){ 
     this.name=firstname; 
     this.Family=lastname; 
     this.sex=sex1; 
     this.population=this.children.size()+1; 
    } 

    public void SetParents(FamilyNode father,FamilyNode mother){ 
     this.Father=father; 
     this.Mother=mother; 
    } 

    public void SetHW(FamilyNode HW){ 
     this.Spouse=HW; 
    } 

    public int Number(){ 
     int number_of_descendants = this.population; 

     if(this.Spouse!=null) number_of_descendants++; 

     for(int index = 0; index < this.children.size(); index++) 
      number_of_descendants = number_of_descendants+ this.children.get(index).Number(); 
      return number_of_descendants; 
    } 

    public void AddChild(FamilyNode Father,FamilyNode child){ 

     //the code here           
    }           
} 
+1

Por favor, podría arreglar su sangría y espacios en blanco; esto es muy difícil de leer en este momento. –

Respuesta

2

respondí uno de sus related questions ayer así que vamos a continuar con el código que he publicado :)

public class FamilyNode { 
    // ... 
    // ... 
    public FamilyNode findNodeByName(String nodeName){ 
     if(name.equals(nodeName)){ 
      // We found a node named nodeName, return it 
      return this; 
     } 
     // That's not me that you are looking for, let's see my kids 
     for(FamilyNode child : children){ 
      if(child.findNodeByName(nodeName) != null) 
       // We found what we are looking, just return from here 
       return child; 
     } 
     // Finished looping over all nodes and did not find any, return null 
     return null; 
    } 

    public void addChild(FamilyNode child){ 
     children.add(child); 
    } 
} 

Básicamente, es necesario encontrar la nodo que está buscando (por nombre en este caso) y eso se puede hacer con el findNodeByName arriba. Una vez que se encuentre el nodo, agréguele un niño.

Use este código como este:

FamilyNode root = ...; 
FamilyNode node = root.findNodeByName("Parent"); 
if(node != null) node.addChild(...); 

NOTA Si desea depurar y visitar todos los nodos del árbol, utilice este método:

public FamilyNode findNodeByName(String nodeName){ 
    System.out.println("Visiting node "+ name); 
    // That's not me that you are looking for, let's see my kids 
    for(FamilyNode child : children){ 
    child.findNodeByName(nodeName) 
    } 
    // Finished looping over all nodes and did not find any, return null 
    return null; 
} 
+0

thx mucho hombre :) – Oli

+0

Seguro no hay problema :) déjame saber cómo va :) – GETah

+0

'for (FamilyNode child: node.children) ¿Cuál es el nodo? ' – Oli

0

Esto no es exactamente una árbol, ya que los niños tienen potencialmente dos padres en lugar de solo uno. Es un grafo dirigido.

Sería bueno cambiar sus nombres de variable y método para que sean coherentes con la convención de Java habitual de comenzar con un carácter en minúscula.

En aras de la coherencia de los datos, es posible considerar la posibilidad de la addChild método algo que simplemente se suma a la lista de hijos del nodo actual, pero en su método de setParents, actualizar las listas de elementos secundarios de ambos padres, añadiendo el nodo actual como un niño allí, llamando al father.addChild(this) y mother.addChild(this) (protegiéndolos de que sean nulos por supuesto).

Si los padres pueden cambiarse cuando están configurados previamente (presumiblemente por error), también deberá eliminar el nodo actual de los padres previamente establecidos. Para esto, es posible que necesite un método removeChild(FamilyNode child). Nuevamente para la coherencia de los datos, este método probablemente también debería establecer el campo principal apropiado en el nodo secundario para anular.

Cuestiones relacionadas