Я хочу посчитать количество всех детей на любом уровне древовидной структуры. Дерево не является двоичным, поэтому у узла может быть более 2 дочерних элементов. Прямо сейчас я создал рекурсивную функцию, которая выполняет эту работу, но она действительно медленная. Мне нужен более быстрый способ, но я не могу сделать это любым другим способом.
Итак, допустим, у нас есть эта таблица:
NodeID | ParentID
-------------------
1 | 0
2 | 1
3 | 1
4 | 2
5 | 1
6 | 2
7 | 3
8 | 5
9 | 6
10 | 8
11 | 6
11 | 6
• 1
• 2
• 4
• 6
• 9
• 11
• 12
• 3
• 7
• 5
• 8
• 10
Итак, если я хочу чтобы получить число детей узла 1, число должно быть 11 вместо 3. То же самое для узла 2. Число должно быть 5 вместо 2.
Это рекурсивная функция, которую я создал в PHP, но это МЕДЛЕННО:
function count_all_nodes($connection, $element_id, $elements=false, $i=0) {
if (!$elements) {
$result = mysqli($connection, "SELECT `node_id`, `parent_id` FROM `elements`");
while ($row = mysqli_fetch_array($result)) {
$sub_elements["node_id"] = $row["node_id"];
$sub_elements["parent_id"] = $row["parent_id"];
$elements[] = $sub_elements;
}
}
foreach ($elements as $element) {
if ($element["parent_id"] == $element_id) {
$i++;
$i += count_all_nodes($connection, $element_id, $elements);
}
}
return $i;
}
Можно ли как-нибудь избежать этой рекурсивной функции?
Спасибо!