Я создаю двоичный код с помощью tsearch(). Является ли созданное дерево сбалансированным автоматически. Как я могу проверить, что дерево сбалансировано или несбалансировано.Является ли дерево, созданное сбалансированным деревом tsearch()?
ответ
Вы можете проверить, позвонив tsearch
на упорядоченный список значений, а затем, вызывая twalk
, поставляя действие, который печатает глубину дерева. Если никакого упорядочения дерева не происходит, то упорядоченные вставки создавали бы список, а не дерево, и вы будете выводить значения возрастающей глубины.
void print_depth(const void *nodep, const VISIT which, const int depth)
{
if(which == preorder || which == leaf) printf("%d\n", depth);
}
twalk(root, print_depth);
ответ Пэдди объясняет, как проверить дерево должно быть сбалансировано, но не дает ответа на вопрос, является ли дерево сбалансировано или нет.
Я сделал то, что предложил Пэдди, и ответ для меня да, это сбалансированный (я запускаю GCC 5.1.1 на Fedora, Glibc 2,21)
(я не уверен, если это также применяется для разных комбинаций операционной системы, компилятора и стандартной библиотеки. Если кто-то экспериментирует с другими ответами на свои системы, добавьте здесь ответ!)
Я изучил это некоторое время назад, работая над my own implementation of tsearch()
. Для этого API имеет смысл использовать дерево AVL, чем дерево Red-Black, поскольку выполнение сравнений с помощью функции обратного вызова имеет довольно высокие накладные расходы. Деревья AVL более оптимально сбалансированы, что означает, что обратный вызов вызывается реже.
Похоже, что определение tsearch()
в POSIX не требует балансировки, поэтому, к сожалению, вы не можете предположить, что эти функции работают хорошо. То, что я наблюдал при рассмотрении некоторых существующих реализаций:
- glibc реализует его как дерево Red-Black.
- musl реализует его как дерево AVL, но до 2015-12-08 он содержит ошибку, которая вызвала
tdelete()
, чтобы сделать дерево неуравновешенным. - Solaris и BSD все, похоже, используют ту же реализацию, которая вообще не использует балансировку.
- FreeBSD 11.0 больше не будет использовать несбалансированную реализацию, так как теперь использует реализацию, которую я написал. FreeBSD 11.0 должен быть выпущен позднее в этом году.
- 1. Realloc испортил дерево, созданное tsearch
- 2. проверить, является ли дерево двоичным деревом поиска
- 3. Является ли Red-Black tree сбалансированным
- 4. Может ли существовать сбалансированное двоичное дерево, не являющееся сбалансированным двоичным деревом поиска? Какова временная сложность?
- 5. Является ли Trie искусственным деревом?
- 6. Является ли null бинарным деревом?
- 7. Попытайтесь проверить, является ли Дерево двоичным деревом поиска
- 8. Чтобы узнать, является ли дерево двоичным деревом поиска или нет
- 9. Проверка того, является ли дерево двоичным деревом поиска
- 10. Является ли tree.DecisionTreeRegressor деревом модели или деревом регрессии?
- 11. В чем разница между сбалансированным двоичным деревом поиска и деревом двоичного поиска?
- 12. Является ли это полным двоичным деревом?
- 13. Проверьте, не является ли однонаправленный граф деревом
- 14. Является ли O (logn) всегда деревом?
- 15. реализовать двоичное дерево и сделать его сбалансированным
- 16. Поиск, если двоичное дерево является двоичным деревом поиска
- 17. Поддерево кратчайшего пути Дерево также является самым коротким деревом?
- 18. Определите, является ли неориентированный граф деревом
- 19. Является ли B-Tree порядка 2 полным двоичным деревом?
- 20. Является ли этот список двоичным деревом поиска?
- 21. Проверьте неориентированный граф является деревом в NetworkX
- 22. двоичное дерево: пользователь решает, должно ли оно быть деревом цифр или деревом слов в программировании c
- 23. Как проверить, является ли дерево BST?
- 24. Должно ли дерево Merkle быть идеальным бинарным деревом?
- 25. Является ли дерево поддеревом другого?
- 26. Проверка, является ли дерево BST
- 27. Как повысить эффективность определения того, является ли дерево AVL-деревом в python?
- 28. Является ли двоичное дерево, которое просто Нет, можно считать деревом с мини-кучей?
- 29. Понимание кода рекурсии Java, чтобы проверить, является ли дерево действительным двоичным деревом поиска
- 30. Функция проверки того, является ли бинарное дерево двоичным деревом поиска или не работает
Создайте простой пример и посмотрите на дерево - что вы видите? Существует более ранний ответ на общий вопрос: «Это дерево сбалансировано» [здесь] (http://stackoverflow.com/questions/742844/how-to-determine-if-binary-tree-isbalanced). Примените его к своему дереву, и у вас будет ваш ответ. – Floris