【问题标题】:Create child nodes using recursion使用递归创建子节点
【发布时间】:2016-03-18 18:06:55
【问题描述】:

我正在尝试从平面数据创建层次结构。我有以下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 以便我可以添加一个 Manager->Hourly->New 层次结构作为子级到 Person

【问题讨论】:

  • Java 是按值返回是什么意思?

标签: java hierarchy


【解决方案1】:

您的方法不需要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树,并返回新生成的节点结构。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多