如何在Java中递归地获取树结构的所有叶子

如何在Java中递归地获取树结构的所有叶子,java,recursion,tree,Java,Recursion,Tree,我有一个树节点的数据库表,如下所示。我想用这些树节点在Java中创建一个ArrayList。Arraylist将以Java中的递归格式递归获取所有树节点 输入: 数据库表 Name ID Parent_ID Parent 1 Child-1 2 1 Child-1.1 3 2 Child-1.1.1 4 3 Child-2 5

我有一个树节点的数据库表,如下所示。我想用这些树节点在Java中创建一个ArrayList。Arraylist将以Java中的递归格式递归获取所有树节点

输入:

数据库表

Name            ID      Parent_ID
Parent          1   
Child-1         2           1
Child-1.1       3           2
Child-1.1.1     4           3
Child-2         5           1
Child-3         6           1
Child-1.1.1.1   7           4
Child-1.2       8           2
我想用下面的Java格式制作上表的ArrayList,其中Sub是子节点的列表,如果没有子节点,则Sub为Null

public class Node {

    private String id;
    private String name;
    private String type;
    private String value;
    private List<Node> sub;
}
公共类节点{
私有字符串id;
私有字符串名称;
私有字符串类型;
私有字符串值;
私人名单小组;
}
输出:

  • 母公司
    • 儿童-1
      • 儿童-1.1
        • 儿童-1.1.1
          • 儿童-1.1.1.1
      • 儿童-1.2
    • 儿童-2
    • 儿童-3
  • 有人能帮我用Java创建一个递归函数来实现上述功能吗。

    这里是一个粗略的算法:

    ArrayList<Integer> ar = new ArrayList<Integer>();
    
    public extract(node root){
        foreach(node i : root.sub)
            extract(i);
        ar.add(i.value);
    }
    
    ArrayList ar=new ArrayList();
    公共提取(节点根){
    foreach(节点i:root.sub)
    提取物(i);
    应收账款增加额(即价值);
    }
    
    问题可以通过以下两个步骤解决,其中表示法是一些Java伪代码。首先,必须将所有数据库行放入
    列表节点
    ,其中
    节点
    应该有一个额外的成员
    ParentID
    ,并且必须构建实际的树结构。这可以按以下方式在时间
    O(n^2)
    中完成,这不是最优的,但对节点索引没有额外的假设

    for (int i = 0; i < Nodes.Count(); i++) // iterate nodes
    {
        for (int j = 0; j < Nodec.Count(); j++) // search parent of i-th node
        {
            if (Nodes[j].id.Equals(Nodes[i].ParentID)) // j-th node is parent of i-th node
            {
                Nodes[j].sub.add(Nodes[i]); // add i-th node to children of j-th node
            }
        }
    }
    
    for(int i=0;i
    之后,可以很容易地识别叶子,因为这些是没有子节点的节点

    for (int i = 0; i < Nodes.Count(); i++)
    {
        if (Nodes[i].sub.Count() == 0) // i-th node is a leaf
        {
            // do something with a leaf
        }
    }
    
    for(int i=0;i
    请注意,我对Java并不太熟悉,但算法思想应该是可以理解的。

    递归函数:

    public void printTree(Node tree,int num)
    {
        if(tree==null || tree.getSub()==null)return;
        for(Node n : tree.getSub())
        {
        System.out.println(new String(new char[num]).replace("\0", "   ")+"*"+n.getName());
    printTree(n,num+1);
    }
    }
    
    public void callRec(Node tree)
    {
        System.out.println(tree.getName());
        printTree(tree,1);
    }
    
    结果将是:

    Parent
    *Child-1
      *Child-1.1
         *Child-1.1.1
            *Child-1.1.1.1
      *Child-1.2
    *Child-2
    *Child-3
    

    到目前为止你有什么?你能想出一种迭代的方法吗(这将有助于产生一个递归版本)?你做了什么来尝试解决这个问题?StackOverflow不是你的“做我的家庭作业”网站。为什么实现需要递归?嗨,Codor,我正在两个映射中获取数据库值:Map1和Map2。从这两个映射中,我试图创建一个ArrayList,递归地将元素推入其中。。如下所示:List mainList=newarraylist;对于(Map1){for(Map2){if(Map1.id.equals.Map2.parentID){mainList.add(Map2.id);//这将首先在列表中添加4个主要节点(Child-1,Child-2,Child-3)}}},现在我不知道如何将Child-1.1添加到Child-1的子字段中,直到n-迭代。请指导。Hi Codor,我在两个映射中获取数据库值:Hi Codor,我在两个映射中获取数据库值:Map1和Map2。从这两个映射中,我试图创建一个ArrayList,递归地将元素推入其中。。如下所示:List mainList=newarraylist;对于(Map1){for(Map2){if(Map1.id.equals.Map2.parentID){mainList.add(Map2.id);//这将首先在列表中添加4个主要节点(Child-1,Child-2,Child-3)}}},现在我不知道如何将Child-1.1添加到Child-1的子字段中,直到n-迭代。请引导。嗨,Codor,你的实现听起来不错。。我试试这个。但您能否确认Child-1.1是否添加到Child-1的子字段中。将从主节点列表中删除if。在将元素添加到列表的子字段后,是否应该从列表中显式删除该元素?无需删除节点;节点不会被删除。更准确地说,处理节点只是为了表示
    sub
    成员中的子关系。嗨,Ben,我将要形成的列表是一个包含子节点的子字段的Arraylist。我正在从数据库中获取它,并根据我上面的问题形成Arraylist Hi Ben,最初所有节点的子元素都将为null。我们需要填充子元素,并根据conditionsHi Noel生成子节点,最初所有节点的子元素都将为null。我们需要填充子元素,并根据条件生成子节点