Есть дерево, в нем возможны 3 элемента
3. Элемент типа 1003 - критерий, у этого элемента есть некоторое значение.
2. Элемент типа 1002 - это подгруппа (т.е. у неё есть род. группа) и она содержит только элементы типа 1003, у неё есть значение(вес).
1. Элемент типа 1001 - Группа верхнего уровня (в неё входят либо только элементы 1002 - подгруппы, либо только элементы 1003 - критерии), у него есть значение(вес).
Глубина/вложенность дерева может быть бесконечно глубокой.
Какой проход необходимо реализовать :
1. Необходимо подсчитать значениях все элементов 1003. (значение_критериев_группы)
2. Умножить значение элементов группы на родительскую группу. (значение_группы или значение_подгруппы)
2.1 Если эта группа вложена в другую группу(т.е. является подгруппой) необходимо умножить её значение на значение родительской группы
3. И так , пока не дойдем до корня.
Вот пример изображения на картинке, как элементы взаимодействуют с собой(это QTreeWidget).
Я набрасал логику алгоритма в текстовом блокнотике в виде "псевдокода", хотелось бы что бы мне помогли понять, правильно ли я понял алгоритм
Код
Подсчитать группы, для этого нужен рекурсивный алгоритм обхода дерева групп критерией :
//Берем список топ-левел айтемов.
//для каждого айтема этого списка
//обнулить : значение_группы, значение_критериев_подгруппы, значение_критериев_группы.
//получаем список его чилдов
//функция_1(список айтемов) :
//для каждого из списка
//если тип айтема 1001(группа, у неё есть подгруппы либо только критерии) получаем количество его чилдов если оно >0 (это исключит пустые группы)
//получаем список чилдов.
//вызываем функция_1 для этого списка.
//если значение_критериев_подгруппы != 0 (Значит была подсчитана подгруппа)
// значение_группы+=вес_группы*значение_подгру
ппы.
//иначе (значит не было подгрупп)
// значение_группы+=вес_группы*значение_критер
иев_группы
//иначе если тип айтема 1002(подгруппа) получаем количество его чилдов если оно >0 (это исключит пустые группы), все его чилды 100% критерии
//для каждого критерия(чилда)
//если его значение !=0
// значение_критериев_группы+=взвешенное_знач
ние_критерия_по_году_рейтинга
// значение_подгруппы=вес_подгруппы*значение_
ритериев_группы
//иначе если тип айтема 1003(критерий) то мы нашли критерий и для него (иначе это пустая группа, но этого лучше не допускать)
//если его значения !=0 (но этого тоже лучше не допускать)
// значение_критериев_группы+=взвешенное_знач
ние_критерия_по_году_рейтинга
//значение верхней группы+=вес_верхней_группы*значение_группы.
//Берем список топ-левел айтемов.
//для каждого айтема этого списка
//обнулить : значение_группы, значение_критериев_подгруппы, значение_критериев_группы.
//получаем список его чилдов
//функция_1(список айтемов) :
//для каждого из списка
//если тип айтема 1001(группа, у неё есть подгруппы либо только критерии) получаем количество его чилдов если оно >0 (это исключит пустые группы)
//получаем список чилдов.
//вызываем функция_1 для этого списка.
//если значение_критериев_подгруппы != 0 (Значит была подсчитана подгруппа)
// значение_группы+=вес_группы*значение_подгру
ппы.
//иначе (значит не было подгрупп)
// значение_группы+=вес_группы*значение_критер
иев_группы
//иначе если тип айтема 1002(подгруппа) получаем количество его чилдов если оно >0 (это исключит пустые группы), все его чилды 100% критерии
//для каждого критерия(чилда)
//если его значение !=0
// значение_критериев_группы+=взвешенное_знач
ние_критерия_по_году_рейтинга
// значение_подгруппы=вес_подгруппы*значение_
ритериев_группы
//иначе если тип айтема 1003(критерий) то мы нашли критерий и для него (иначе это пустая группа, но этого лучше не допускать)
//если его значения !=0 (но этого тоже лучше не допускать)
// значение_критериев_группы+=взвешенное_знач
ние_критерия_по_году_рейтинга
//значение верхней группы+=вес_верхней_группы*значение_группы.
Но проблема в том, что в Qt (4.7.1) нельзя просто получить список детей элемента(только итерировать по ним, либо получить, но они удаляться из виджета/айтема). Я попробую написать алгоритм, но прощу помощи здесь, вдруг что-то упустил..
Сообщение отредактировано: Andrewshkovskii -