我写了这个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
}
}
答案 0 :(得分: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;
}
答案 1 :(得分:0)
这不完全是一棵树,因为孩子可能有两个父母,而不只是一个。这是有向图。
最好将变量和方法名称更改为与以小写字符开头的常规Java约定一致。
为了保持数据的一致性,您可以考虑将addChild
方法简单地添加到当前节点的子项列表中,但在setParents
方法中,更新子列表父母双方,通过调用father.addChild(this)
和mother.addChild(this)
将当前节点作为孩子添加到那里(当然,防止他们为空)。
如果父母可以在之前设置时更改(可能是错误的),则还需要从先前设置的父项中删除当前节点。为此,您可能需要removeChild(FamilyNode child)
方法。同样,对于数据一致性,此方法还应该将子节点中的相应父字段设置为null。