2015-01-11 4 views
0

Нужно выполнять агрегацию в иерархической древовидной структуре с использованием Java. Для этого предлагаем несколько полезных методов или API.Агрегация в иерархическом дереве

структура дерева:

А является корневым узлом и имеет два узла B и C. В имеет два дочерних узлов В1 и В2 и аналогично С имеет два дочерних узлов С1 и С2. У каждого листового узла есть определенное значение.

Мне нужно заполнить значения, начиная с листа до корневого узла.

В приведенном выше примере, если значения листовых узлов B1 = 5, B2 = 5, C1 = 3 и C2 = 7. Тогда Агрегация даст значение от 10 до узла B и от 10 до C узла. Корневой узел A будет иметь значение 20.

Пожалуйста, предложите решение.

Мне нужно загрузить древовидную структуру из файла. Мой файл выглядит следующим образом.

Узел | Id | ParentId
A | 1 | 1
B | 2 | 1
С | 3 | 1
В1 | 4 | 2
В2 | 5 | 2
С1 6 | 3
C2 | 7 | 3

Спасибо.

+0

вам следует попробовать его, используя связанный список – Prashant

+0

Я еще ничего не реализовал. Я думаю, что у меня есть структура данных, с которой я могу переходить от листового узла к корневому узлу и совокупному значению на каждом родительском узле. – user3222372

+0

Prashant, вы можете быть более конкретным? – user3222372

ответ

0

Я предлагаю расследовать Composite Pattern. По существу это включает в себя интерфейс Node с методом getValue, а затем реализации Node под названием Leaf и Composite. Композит имеет ссылки на Node.

Различные реализации getValue либо возвращают значение листа, либо суммируют значения дочерних элементов.

Например:

interface Node { 
    public int getValue(); 
} 

class Leaf implements Node { 
    private final int value; 
    public Leaf(int value) { 
     this.value = value; 
    } 
    public int getValue() { 
     return value; 
    } 
} 

class Composite implements Node { 
    private final Node left; 
    private final Node right; 
    public Composite(Node left, Node right) { 
     this.left = left; 
     this.right = right; 
    } 
    public int getValue() { 
     return left.getValue() + right.getValue(); 
    } 
} 

Вот пример кода с использованием этой иерархии:

Leaf b1 = new Leaf(5); 
Leaf b2 = new Leaf(5); 
Node b = new Node(b1, b2); 
Leaf c1 = new Leaf(3); 
Leaf c2 = new Leaf(7); 
Node c = new Node(c1, c2); 
Node a = new Node(b, c); 
System.out.println("a value = " + a.getValue()); 

При вызове a.getValue() вызывается b.getValue(), который вызывает b1.getValue() и так далее. Дерево перемещается и значения суммируются.

Как было указано в комментариях, добавлены конструкторы, хотя я чувствую себя подозрительно, что я выполняю ваше задание для вас!

+0

Я должен рассматривать каждый узел отдельно не как состав других узлов. Как состав может помочь мне перейти от листового узла к корню? – user3222372

+0

Я добавлю несколько примеров кода в ответ, чтобы он был яснее. – sprinter

+0

Спасибо Sprinter за образец кода. Это статическая структура дизайна. Я должен динамически создавать дерево. Во время выполнения я узнаю о своих узлах и его родительском/дочернем объекте. Во время выполнения, как мне создать эту структуру и сделать агрегацию? – user3222372

Смежные вопросы