Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add a child to a specific node in n-array tree?

I wrote this n-array tree class. I want to write a method to add a child to a specific node in my tree.

First I should search my tree to find the father then add the child to that node children. I don't know how I should declare my method

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                                         
    }                                        
}
like image 913
Mohammad Olfatmiri Avatar asked Nov 03 '22 21:11

Mohammad Olfatmiri


1 Answers

I answered one of your related questions yesterday so let's continue with the code I posted :)

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

Basically, you need to find the node you are looking for (by name in this case) and that can be done by the findNodeByName above. Once the node is found, add one child to it.

Use this code like this:

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

NOTE If you want to debug and visit all your tree nodes, use this method:

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;
}
like image 81
GETah Avatar answered Nov 12 '22 13:11

GETah