Алгоритм зовётся обходом графа (в нашем случае дерева) в ширину. Про «средствами SQL» сразу оговорюсь: не SQL'92.
Выглядит примерно так:
Взять пустые очеpеди O1 и O2
Поместить коpень в очеpедь O1
while (Одна из очеpедей O1 и O2 не пуста) {
if ( O1 не является пустой ) {
Пусть p - узел, находящийся в голове очеpеди O1
Посетить веpшину p и удалить ее из O1
Поместить всех сыновей веpшины p в очеpедь O2, начиная со стаpшего сына.
}
else {
В качестве O1 взять непустую очеpедь O2
в качестве O2 взять пустую очеpедь O1
}
}
Тут та же ситуация, что с конфигурацией фаервола… или прав доступа: лучше запретить всё, а потом разрешать, чем разрешить всё а потом затыкать дыры. В CI гораздо проще случайно оставить action открытым.
Выглядит примерно так:
Взять пустые очеpеди O1 и O2 Поместить коpень в очеpедь O1 while (Одна из очеpедей O1 и O2 не пуста) { if ( O1 не является пустой ) { Пусть p - узел, находящийся в голове очеpеди O1 Посетить веpшину p и удалить ее из O1 Поместить всех сыновей веpшины p в очеpедь O2, начиная со стаpшего сына. } else { В качестве O1 взять непустую очеpедь O2 в качестве O2 взять пустую очеpедь O1 } }Размер ни на что не влияет.
Тут та же ситуация, что с конфигурацией фаервола… или прав доступа: лучше запретить всё, а потом разрешать, чем разрешить всё а потом затыкать дыры. В CI гораздо проще случайно оставить action открытым.