Помогите составить алгоритм(деревья)
От: openair  
Дата: 10.06.09 09:24
Оценка:
Есть динамическое(заренее структура не определена) дерево
скажем
Node0 : UNKNOWN
--Node1 : value 15
--Node2: UNKNOWN
----Node21 : value 9
----Node22 : value 1
--Node3: UNKNOWN
----Node31 : value 3
----Node32 : value 5

Для каждого node у которого нет детей посчитать сумму value.

Node3 = Node31 + Node32
Node2 = Node21 + Node22
Node0 = Node2 + Node3
Re: Помогите составить алгоритм(деревья)
От: cvetkov  
Дата: 10.06.09 11:24
Оценка:
но у Node3, Node2 и Node0 есть дети
... << RSDN@Home 1.2.0 alpha 4 rev. 1227>>
Re[2]: Помогите составить алгоритм(деревья)
От: openair  
Дата: 10.06.09 12:50
Оценка:
Здравствуйте, cvetkov, Вы писали:

C>но у Node3, Node2 и Node0 есть дети


Да, точно. Извиняюсь.

Node
---Node0 = ?
-----Sub01 : val = 32
-----Sub02 : val = 12
-----Sub03 : val = 42
---Node1 = ?
-----Sub11 : val = 12
-----Sub12 : val = 93
-----Sub13 : val = 21
-----Node10 : ?
--------Sub100 : val = 11
--------Sub101 : val = 10

для node посчитать сумму Sub
примерно вот таким образом удалось посчитать суммы нодов
т.е.
Node
---Node1
------Sub10
---Node2
------Sub20
------Node21
---------Sub211
---------Sub212
но решение судя по всему кривое


class Node
{
   float Summa;
   List<Node> Nodes;
}
void Build() //-------------
{
   int depth = 0;
   float total_sum = 0; 
   float sum_per_node = 0;
   foreach(Node n in rootNodes)
   { 
       Build(ref node, ref total_sum, ref sum_per_node, ref depth);
       // Out(total_sum for node n)
   }
}
void Build(ref Node node, ref float sum, ref sum_per_node, ref nest_depth)
{
  ++nest_depth;

   foreach(Node n in node.Children)
   {
        if(n.Children.Count > 0)
          Build(ref n, ref sum, ref sum_per_node, ref nest_depth);
        else
        {
          sum_per_node += n.Summa;
        }
   }

   if(nest_depth >= 2)
   { 
      //SetNodeSumma(node, sum_per_node)
   }
   else if(nest_depth == 1)
   {
      sum += sum_per_node;
      sum += node.Summa;
   }

   sum_per_node := 0;

  --nest_depth;
}

зы Код абстрактный
Re[3]: Помогите составить алгоритм(деревья)
От: MBo  
Дата: 10.06.09 13:40
Оценка:
Все равно непонятно, что нужно сделать.
Узел без детей называется лист. У листа по определению нет детей — откуда же сумму брать?
Re[4]: Помогите составить алгоритм(деревья)
От: openair  
Дата: 10.06.09 14:08
Оценка:
Здравствуйте, MBo, Вы писали:

MBo>Все равно непонятно, что нужно сделать.

MBo>Узел без детей называется лист. У листа по определению нет детей — откуда же сумму брать?

Аналогия на практике :
Есть у нас корневая директория в которой могут быть файлы и папки.

Music ?
--Rock ?
----Song1.mp3 : 100kb
----Song2.mp3 : 200kb
----Instrumental rock ?
------Song1.mp3 : 200kb
------Song2.mp3 : 600kb
--Classic ?
----Simphony1.mp3 : 400кб
----Moczart ?
------Moczart symphony1.mp3 : 100kb

Задача состоит в том что бы просчитаь размеры всех папок.

InstrumentalRock = Song1.mp3.Size + Song2.mp3.Size
Rock = InstrumentalRock + Song1.mp3.Size + Song2.mp3.Size
Moczart = Moczart symphony1.mp3.Size
Classic = Sumphony1.mp3.Size + Moczart
Music = Rock.Size + Classic.Size
Re[3]: Помогите составить алгоритм(деревья)
От: cvetkov  
Дата: 10.06.09 14:50
Оценка:

int build(Map<node, int> lengths, Node node){
    int curr = 0;
    for(Node sub in node.children){
        if(sub.Leaf){
            curr+=sub.Size;
        }else{
            curr+=build(lengths, sub);
        }        
    }
    length.Add(node, curr); 
}

вызов

Map<node, int> lengths = new Map<node, int>();
build(lengths, root);
for(Node n in lengths.Keys){
    out(n.Name + " " + lengths.get(n));
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1227>>
Re[4]: Помогите составить алгоритм(деревья)
От: Аноним  
Дата: 11.06.09 05:16
Оценка:
Здравствуйте, cvetkov, Вы писали:

C>

C>int build(Map<node, int> lengths, Node node){
C>    int curr = 0;
C>    for(Node sub in node.children){
C>        if(sub.Leaf){
C>            curr+=sub.Size;
C>        }else{
C>            curr+=build(lengths, sub);
C>        }        
C>    }
C>    length.Add(node, curr); 
C>}
C>

C>вызов
C>

C>Map<node, int> lengths = new Map<node, int>();
C>build(lengths, root);
C>for(Node n in lengths.Keys){
C>    out(n.Name + " " + lengths.get(n));
C>}

C>


Спасибо! Сейчас попробую)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.