Предположим, у нас есть дерево, где каждый узел имеет предварительно заданный набор исходящих узлов. Можно ли придумать быстрый способ/оптимизацию, чтобы подсчитать количество листовых узлов с учетом значения уровня? Было бы здорово, если бы кто-то мог предложить любые идеи/ссылки/ресурсы, чтобы сделать то же самое.подсчет узлов листа в дереве
ответ
Нет. Вам все равно придется пересекать все дерево. Невозможно предсказать точную структуру - или приблизить ее - только от числа дочерних узлов каждого узла дерева.
Помимо этого: просто держите счетчик и обновляйте его на каждой вставке. Далеко проще и не изменит сложность времени любой операции, кроме подсчета листьев, которая будет уменьшена до O(1)
.
Не могли бы вы предоставить простой псевдокод о том, как мы могли бы вычислить «число» листовых узлов в O (1) раз? –
@ N.M. Как я уже писал в ответ: просто используйте счетчик для листьев. Я не думаю, что для этого нужен код. И код будет почти полной реализацией дерева – Paul
Это может стать довольно сложной задачей. Поскольку он отличается от языка программирования, какова структура входных данных, это дерево двоичное или общее дерево (произвольное количество детей), размер дерева.
Самая общая идея - запустить DFS или BFS, начиная с корня, чтобы получить каждый уровень узла, а затем составить список наборов, где каждый набор содержит узлы одного уровня. Набор может быть любой структурой, стандартный список в порядке.
Предположим, вы работаете на C++, что является хорошим, если не лучшим практическим выбором, если вам нужна производительность (даже лучше, чем C).
Предположим, у нас есть общее дерево, а структура ввода - это список смежности, как вы упомянули.
Затем вы запускаете либо BFS, либо DFS, либо для дерева, сохраняя уровень для каждого узла. Уровень для следующего узла - это уровень его родителя плюс один.
Как только вы обнаружите уровень, вы помещаете узел таким образом.
vector<vector<int>> nodesPartitionedByLevels(nodeCount);
//run bfs here
//inside it you call
nodesPartitionedByLevels[level].push_back(node)
Это примерно.
Затем, когда у вас есть уровни, вы перебираете все узлы этого уровня, и вы проверяете список смежных, если он связывает любые узлы.
в основном вы называете adjList[node].empty()
. Если это правда, это листовой узел.
- 1. Подсчет узлов в дереве
- 2. Подсчет узлов в двоичном дереве
- 3. Перемещение всех узлов листа в дереве C#
- 4. Подсчет узлов в общем дереве в python
- 5. Подсчет количества узлов в двоичном дереве поиска
- 6. Подсчет количества узлов в полном двоичном дереве
- 7. Подсчет узлов в двоичном дереве поиска
- 8. Подсчет узлов в двоичном дереве поиска
- 9. Подсчет узлов в двоичном дереве поиска
- 10. Подсчет количества узлов в диаграмме листа
- 11. Подсчет количества узлов в бинарном дереве с листьями
- 12. Учет узлов в двоичном дереве без листа?/Node? в схеме?
- 13. Подсчет нулевых узлов в двоичном дереве в прологе
- 14. Подсчет узлов в двоичном дереве поиска в Python
- 15. Подсчет различных типов узлов в бинарном дереве поиска
- 16. Подсчет узлов с определенным значением в двоичном дереве
- 17. Подсчет Происхождения в дереве
- 18. Подключение узлов в дереве
- 19. Создание узлов в дереве
- 20. Адресация узлов в дереве
- 21. Подсчет узлов в BST
- 22. Найти узлы листа в иерархическом дереве
- 23. Количество листовых узлов в бинарном дереве
- 24. Удаление всех узлов в дереве - C++
- 25. Подсчет числа внуков в дереве
- 26. Число узлов в дереве B
- 27. Нестандартная проверка узлов в дереве
- 28. Число ветвящихся узлов в дереве
- 29. Число узлов в сбалансированном дереве
- 30. Схват списка узлов в дереве?
Вы имеете в виду, что каждый узел имеет точно 'd' детей? –
@SalvadorDali не обязательно –
, тогда нет простого способа подсчитать его (просто я имею в виду, не просматривая все дерево), потому что код на самом деле прост. –