В BST все значения, нисходящие с левой стороны узла, меньше (или равны, см. Позже) самого узла. Аналогично, все значения, нисходящие на правой стороне узла, больше (или равны) значению узла (a) .
Некоторые BST могут разрешить дублирование значений, следовательно, квалификаторы "или равно" выше.
Следующий пример может прояснить:
|
+--- 14 ---+
| |
+--- 13 +--- 22 ---+
| | |
1 16 +--- 29 ---+
| |
28 29
Это показывает BST, который допускает дублирование - вы можете видеть, что, чтобы найти значение, вы начинаете с корневого узла и спускаетесь по левому или правому поддереву в зависимости от того, является ли значение поиска меньше или больше значения узла.
Это можно сделать рекурсивно с помощью чего-то вроде:
def hasVal (node, srchval):
if node == NULL:
return false
if node.val == srchval:
return true
if node.val > srchval:
return hasVal (node.left, srchval)
return hasVal (node.right, srchval)
и вызывая его с помощью:
foundIt = hasVal (rootNode, valToLookFor)
Дубликаты добавляют небольшую сложность, поскольку вам может потребоваться продолжить поиск, как только вы нашли свое значение для других узлов с таким же значением.
(a) Вы могли бы на самом деле отсортировать их в обратном направлении, если пожелаете, при условии, что вы настроите поиск определенного ключа. BST нужно поддерживать только некоторый отсортированный порядок, независимо от того, возрастает он или нет.