2017-01-21 15 views
2

Я создал структуру, чтобы представить простое дерево, как это:Счетные потомки в дереве

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

Каждый узел представляет собой запись, которая является мой собственный класс с некоторыми полями внутри. В следующем примере упрощается только поле, содержащее дочерние узлы. Когда список пуст, мы имеем листовой узел.

Моя цель - написать функцию, которая возвращает ВСЕ потомки данного узла.

Это код, который я написал:

 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 , D, Е, F, G. Я не понимаю, почему это неправильно. Где ошибка и как я могу это решить?

+0

Это сложная сложность для того, что должно быть относительно простым. Вы не указали источник для 'Record', но я подозреваю, что ему нужно много рефакторинга. –

+0

Запись не имеет значения. Он содержит всего 3 поля, заполненных строками. Я избегал делать более полный текст всего кода. – user840718

ответ

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; 
+0

Я пробовал ваше решение, но я получил следующую ошибку: Исключение в потоке «main» java.util.ConcurrentModificationException. Связано ли это с неправильным использованием LinkedList? Спасибо. – user840718

+0

@ user840718 Вижу, вам также нужно клонировать результат. Я скоро отредактирую. – dasblinkenlight

0

Проблема заключается в ваш цикл. Вы вспоминаете ту же функцию, ведьма дает ответную запись. Проблема в том, что вы ничего не делаете с этим возвратом.
Попробуйте присоединиться к списку результатов с результатом вызова функции.
Я не тестировал его, но думаю, он должен работать.

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