Для несамостоятельного дерева (возможно, но необычно для дерева поиска) наихудшим случаем является O (n), что для вырожденного двоичного дерева (связанный список).
В этом случае вам нужно в среднем выполнить поиск по половине списка, прежде чем найти нужный элемент.
Наилучшим случаем является O (log 2 n) для идеально сбалансированного дерева, поскольку вы сокращаете пространство поиска пополам для каждого уровня дерева.
Средний случай находится где-то посередине между этими двумя и полностью зависит от данных: -)
Поскольку вам редко удается контролировать последовательность, в которой данные вставляются в дерево, самобалансировочные деревья обычно предпочтительны, поскольку, хотя они добавляют небольшое количество времени к каждой вставке или удалению, они значительно ускоряют поиск. Их наихудший случай намного лучше, чем несбалансированные деревья.
8
_______/ \_______
/ \
4 12
__/ \__ __/ \__
/ \ / \
2 6 10 14
/ \ / \ / \ / \
1 3 5 7 9 11 13 15
В этом прекрасно сбалансированном дереве вы можете видеть, что вы получаете 2 n -1 узлов на каждый n
уровень. Это означает, что для 15 узлов вам никогда не придется искать более четырех узлов, чтобы найти его (например, чтобы найти 13
, вы будете искать 8
, 12
, 14
и 13
). Отсюда и получается лог 2 n.
Вырожденное несбалансированное дерево, как уже говорилось, является связанным списком. Если ваши данные поступили последовательно и вы вставили их в несбалансированное двоичное дерево, вы получите:
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -+
|
+------------------------------------------+
|
+-> 10 -> 11 -> 12 -> 13 -> 14 -> 15
Чтобы найти 13
в этом случае, вам нужно искать 1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
, 10
, 11
, 12
и 13
, следовательно, O (n).