2012-07-01 36 views
5

Я написал этот класс дерева n-массива. Теперь я хочу написать метод для добавления дочернего элемента к определенному узлу в моем дереве, так как сначала я должен искать свое дерево, чтобы найти отца, а затем добавить ребенка к этому узлу. я не знаю, как я должен объявить свой методКак добавить ребенка к определенному узлу в дереве n-массива?

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

Пожалуйста, не могли бы вы исправить ваши отступы и пробелы; это очень трудно читать прямо сейчас. –

ответ

2

Я ответил один из ваших related questions вчера так давайте продолжать с кодом я отправил :)

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

в принципе, вам нужно найти который вы ищете (по названию в этом случае), и это может быть сделано с помощью findNodeByName выше. Как только узел будет найден, добавьте к нему одного ребенка.

Используйте этот код, как это:

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

ПРИМЕЧАНИЕ Если вы хотите отладить и посетить все узлы дерева, используйте этот метод:

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 много man :) – Oli

+0

Несомненно, нет проблем :) дайте мне знать, как это происходит :) – GETah

+0

'for (FamilyNode child: node.children) whats node? ' – Oli

0

Это не совсем дерево, поскольку у детей есть потенциально два родителя, а не только один. Это ориентированный граф.

Было бы полезно изменить имена переменных и методов в соответствии с обычным соглашением Java, начинающимся с символа нижнего регистра.

В интересах согласованности данных вы можете подумать о том, чтобы сделать метод addChild чем-то, что просто добавляет к списку дочерних элементов для текущего узла, но в вашем методе setParents обновляет дочерние списки обоих родителей, добавляя текущий узел как ребенок там, позвонив father.addChild(this) и mother.addChild(this) (защита от них, конечно, не указана).

Если родители могут быть изменены, если они ранее установлены (предположительно, по ошибке), вам также необходимо удалить текущий узел из ранее установленных родителей. Для этого вам может понадобиться метод removeChild(FamilyNode child). Опять же для согласованности данных этот метод должен, вероятно, также установить для соответствующего родительского поля в дочернем узле значение null.

Смежные вопросы