@Leo_Eldorado

Как адаптировать итеративный алгоритм обхода бинарного дерева к обходу сильноветвящегося дерева?

Здравствуйте.
Мне необходимо реализовать итеративный обход сильноветвящегося дерева в глубину, в порядке "вершина – левое поддерево – правое поддерево". Как сделать это для бинарного дерева, используя стек, понятно, но как сделать для сильноветвящегося не очень ясно. Прошу ссылку на литературу или на реализацию на любом языке.
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 3
AshBlade
@AshBlade
Просто хочу быть счастливым
Разницы нет. Просто теперь потомки каждого узла лучше представлять в виде массива, по которому нужно итерироваться - без left и right

void Visit(Node node) {
     for (auto child: node.children()) {
           stack.append(child);
     // Не так
     // if (node.left != nullptr) {
     //    stack.append(node.left);
     //  }
     // if (node.right != nullptr) {
     //    stack.append(node.right);
     //  }
   
}
Ответ написан
0xD34F
@0xD34F
на любом языке

Ну как скажете:

копирование
суммирование
поиск значений, удовлетворяющих какому-либо условию - одного или всех, что есть
Ответ написан
Комментировать
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Вам надо помнить, сколько детей каждой вершины вы уже обработали. Поэтому в стеке надо хранить 2 числа: вершину и сколько детей обработали. Или 2 стека параллельно обновлять.

Изначально в стек поместите корень дерева и 0. Потом в цикле, пока стек не пуст, смотрите на вершину стека. Если там счетчик 0, то выводите вершину в ответ. Увеличивайте там счетчик на 1. Если он стал равен количеству детей у вершины, удаляйте ее из стека. Иначе добавляйте в стек вершину-ребенка с номером из счетчика с 0. Можно чуть по другому: выводите вершину при помещении ее в стек с 0. Но тогда надо отдельно вывести корень дерева.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы