но у Node3, Node2 и Node0 есть дети
... << RSDN@Home 1.2.0 alpha 4 rev. 1227>>
Здравствуйте, 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;
}
зы Код абстрактный
Все равно непонятно, что нужно сделать.
Узел без детей называется лист. У листа по определению нет детей — откуда же сумму брать?
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>>
Здравствуйте, 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>
Спасибо! Сейчас попробую)