我已经创建了一个结构来表示这样一个简单的树:
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。我不明白为什么这是错的。错误在哪里,我该如何解决?
答案 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));