计算树中的后代

时间:2017-01-21 00:02:19

标签: java tree

我已经创建了一个结构来表示这样一个简单的树:

      A
     / \
    B   C
   / \  / \
  D  E  F  G

每个节点都是一个Record,它是我的自定义类,里面有一些字段。在下面的示例中,仅使用包含节点子节点的字段进行了简化。当列表为空时,我们有一个叶节点。

我的目标是编写一个返回给定节点的所有后代的函数。

这是我写的代码:

     public static void main(String[] args) {

     HashMap<String, Record> treeMap = new HashMap<String, Record>();
     treeMap.put("A", new Record(new LinkedList<String>(Arrays.asList("B","C"))));
     treeMap.put("B", new Record(new LinkedList<String>(Arrays.asList("D", "E"))));
     treeMap.put("C", new Record(new LinkedList<String>(Arrays.asList("F", "G"))));
     treeMap.put("D", new Record(new LinkedList<String>()));
     treeMap.put("E", new Record(new LinkedList<String>()));
     treeMap.put("F", new Record(new LinkedList<String>()));
     treeMap.put("G", new Record(new LinkedList<String>()));
     System.out.println(descendantsRN("A", treeMap));
}

public static LinkedList<String> descendantsRN(String rn, HashMap<String, Record> map)
{
    LinkedList<String> result = null;
    if(map.get(rn).getListOfChildren()!= null)
    {
        result = map.get(rn).getListOfChildren();
        LinkedList<String> children = map.get(rn).getListOfChildren();
        for (String child : children) {
            descendantsRN(child , map);
        }
    }
    return result;
}

问题如下:当我在之前的例子中打印出后代时,我只得到B和C,而不是B,C,D,E,F,G。我不明白为什么这是错的。错误在哪里,我该如何解决?

2 个答案:

答案 0 :(得分:2)

您只获得了第一级后代,因为您忽略了递归调用descendantsRN返回的列表。

在结果上调用addAll可以解决此问题:

LinkedList<String> result = new LinkedList<String>();
LinkedList<String> children = map.get(rn).getListOfChildren();
result.addAll(children);
for (String child : children) {
    result.addAll(descendantsRN(child , map));
}
return result;

答案 1 :(得分:0)

问题出在你的for循环中。你回想起同样的功能,女巫给出了回报。问题是你对这种回报没有任何作用 尝试将结果列表与函数调用的结果一起加入。
我没有测试过,但我认为它应该可以工作。

result.addAll(descendantsRN(child , map));