2

私はファミリーツリーのためにこのツリークラスを書きました

今、私は私のツリーでノードを見つけるための検索メソッドが必要です

各ノードが0からn個の子を持つことができるn-aryツリー

検索方法では、ノードを検索できます。または、ノード名と父親の名前を含む2つの名前を検索できます。

plzは私を助けます

public class FamilyNode {
 public String name;
 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 name1,String sex1){
this.name=name1;
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 void AddChild(FamilyNode child){
    child.SetParents(this.Father, this.Spouse);
    this.children.add(child);
    this.Spouse.children.add(child);
}

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

}
4

1 に答える 1

3

ツリートラバーサルアルゴリズムをご覧ください。この記事はそれらをかなりうまくカバーしています(再帰とデキューを使用)これがあなたのツリーをトラバースする1つの方法です

public class FamilyNode {
    // ...
    // ...
    public void traverseNode(){
       if(name.equals("NameWeAreLookingFor")){
          // We found a node named "NameWeAreLookingFor"
          // return here if your are not interested in visiting children
       } 
       for(FamilyNode child : node.children){
            child.traverseNode();
       }
    }
}

すべてのツリーをトラバースするには、次の手順を実行します。

FamilyNode root = ...;
root.traverseNode();

このメソッドは再帰を使用していることに注意してください。ツリーが非常に大きい場合は、再帰がStackOverFlow例外で発生する可能性があるため、代わりにキューを使用することをお勧めします。

于 2012-06-30T16:59:33.867 に答える