5

この 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                                         
    }                                        
}
4

2 に答える 2

2

昨日、関連する質問の1つに回答したので、投稿したコードを続けましょう:)

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上記で行うことができます。ノードが見つかったら、それに1つの子を追加します。

このコードを次のように使用します。

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;
}
于 2012-07-01T18:11:04.960 に答える
0

子は 1 つではなく 2 つの親を持つ可能性があるため、これは厳密にはツリーではありません。有向グラフです。

小文字で始まるという通常の Java 規則と一致するように、変数とメソッドの名前を変更することをお勧めします。

addChildデータの一貫性のために、メソッドを現在のノードの子のリストに単純に追加するものにすることを検討するかもしれませんが、setParentsメソッドでは、現在のノードを子として追加して、両方の親の子リストを更新します。呼び出しfather.addChild(this)mother.addChild(this)(もちろんnullになるのを防ぎます)。

親が以前に設定されたときに (おそらくエラーで) 変更できる場合は、以前に設定された親から現在のノードを削除する必要もあります。このためには、removeChild(FamilyNode child)メソッドが必要になる場合があります。繰り返しますが、データの一貫性のために、このメソッドはおそらく子ノードの適切な親フィールドも null に設定する必要があります。

于 2012-07-01T18:29:36.050 に答える