5

我写了这个 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                                         
    }                                        
}
4

2 回答 2

2

我昨天回答了你的一个相关问题,所以让我们继续我发布的代码:)

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

这不完全是一棵树,因为孩子可能有两个父母,而不仅仅是一个。这是一个有向图。

最好将变量和方法名称更改为与通常的以小写字符开头的 Java 约定一致。

出于数据一致性的考虑,您可以考虑使该addChild方法简单地添加到当前节点的子列表中,但在您的setParents方法中,更新两个父节点的子列表,将当前节点作为子节点添加到那里,通过调用father.addChild(this)and mother.addChild(this)(当然要防止它们为空)。

如果父节点在先前设置时可以更改(可能是错误的),您还需要从先前设置的父节点中删除当前节点。为此,您可能需要一种removeChild(FamilyNode child)方法。同样为了数据的一致性,这个方法可能还应该将子节点中的相应父字段设置为空。

于 2012-07-01T18:29:36.050 回答