如何以Java的形式递归获取树结构的所有叶子

时间:2016-02-20 10:02:19

标签: 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           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;
}

输出:

    • 小孩子1
      • 小孩子1.1
        • 小孩子1.1.1
          • 小孩子1.1.1.1
      • 小孩子1.2
    • 小孩子2
    • 小孩子3
  1. 有人可以帮助您在Java中创建递归函数来实现上述功能。

3 个答案:

答案 0 :(得分:0)

这是一个粗略的算法:

ArrayList<Integer> ar = new ArrayList<Integer>();

public extract(node root){
    foreach(node i : root.sub)
        extract(i);
    ar.add(i.value);
}

答案 1 :(得分:0)

问题可以通过以下两个步骤解决,其中符号是一些Java-ish伪代码。首先,所有数据库行都必须放在List<Node> Nodes中,其中Node应该有一个额外的成员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 < Nodes.Count(); i++)
{
    if (Nodes[i].sub.Count() == 0) // i-th node is a leaf
    {
        // do something with a leaf
    }
}

请注意,我不太熟悉Java,但算法理念应该是可以理解的。

答案 2 :(得分:0)

递归函数:

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