使用递归创建子节点

时间:2016-03-18 18:06:56

标签: java hierarchy

我正在尝试从平面数据创建层次结构。我有以下Node定义:

public class Node {
        public String name;
        public List<Node> children = new ArrayList<>();
    }

鉴于此数据:[Person,Manager,Hourly,New],树应该是这样的:

Person
  |--Manager
       |--Hourly
            |--New

我尝试了以下内容:

public void run()
    {
        List<List<String>> objects = new ArrayList<>();

        String[] str = {"Person","Manager","Hourly","New"};
        objects.add(Arrays.asList(str)) ;

        String[] str2 = {"Person","Manager","Salary"};
        objects.add(Arrays.asList(str2)) ;

        String[] str3 = {"Person","Manager","Salary", "New"};
        objects.add(Arrays.asList(str3)) ;

        // Create a Node with the sequence
        myNode = new Node();
        createNode(objects.get(0), 0, myNode, myNode);
        LOG.debug(myNode.name);
}

我的createNode方法是:

public Node createNode(List<String> seq, Integer start, Node parentNode, Node childNode)
    {
      // do something and return a Node?
    }

但从概念上讲,如果Java是按值返回,我不明白如何维护结构。我应该向createNode添加什么内容,以便我可以将管理器 - &gt;每小时 - &gt;新层次结构作为子项添加到Person

2 个答案:

答案 0 :(得分:0)

您的方法不需要Node返回类型 Node参数。

以下是一种方法:

//in run()
myNode = new Node();
myNode.name = "Root";
createNode(objects.get(0), 0, myNode, myNode);



public void createNode(List<String> seq, Integer start, Node parentNode)
{
    Node childNode = new Node();
    childNode.name = seq[start];
    parentNode.children.Add(childNode);
    createNode(seq, start+1, childNode);
}

您不需要从createNode()返回任何内容 - 因为您有parentNode作为变量,您可以向其children成员添加内容。对createNode()的调用将递归地添加子节点,跟随字符串数组到达结尾。

另一种方法是:

public Node createNode(List<String> seq, Integer start)
{
    if (start >= seq.Length) {
        return null;
    }
    Node node = new Node();
    node.name = seq[start];
    node.children.Add(createNode(seq, start+1);

    return node;
}

在这种情况下,您根本不需要传递node个引用;调用createNode()将生成一个新的节点对象,递归填充其children树,并返回新生成的节点结构。

答案 1 :(得分:0)

我可以看到你对节点的定义有点类似于图中的邻接列表。 在目标节点中,在与目标节点关联的列表中添加关联节点。对于属于所有节点的每个节点都是如此。

对于createNode方法中属于objects数组(数组参数)的每个对象,您需要创建Node对象。 只需传递一个String数组和taeget节点。迭代列表并创建一个节点。在列表中添加节点。

为避免重复,请在创建节点时将其添加到地图中。映射的键应该是String,值应该是Node对象。在创建节点对象之前,只需尝试从地图中获取对象,仅在地图中找不到对象时才创建对象(在这种情况下创建并将其添加到地图中)。如果在地图上找到了对象,我们就不会重新创建它。