Когда вы называете себя рекурсивно, как это:
InOrder_search_recursive(node.lChild)
Это просто обычный вызов функции, как и любой другой. Он просто вызывает функцию и возвращает результат. Это не автоматически return
значение из этой функции или что-то еще.
Итак, вы выполняете поиск по левому краю, игнорируете результаты, затем продолжаете проверять node.value == key
и, если это не удается, вы выполняете поиск по правому поддереву, снова игнорируете результаты и падаете с конца функция, означающая, что вы возвращаете None
.
Для выполнения этой работы вам необходимо указать return
значение, которое вы получили. Но, конечно, только если это not None
.
Кроме того, вы забыли передать аргумент key
до рекурсивного вызова, так что вы просто получите TypeError
. (Я предполагаю, что ваш реальный код не имеет эту проблему, но так как вы не показали нам свой реальный код, или рабочий пример, я не могу быть уверен, ...)
Итак:
def Inorder_search_recursive(node, key):
if not node:
return None
result = InOrder_search_recursive(node.lChild, key)
if result is not None:
return result
if node.value==key:
return node
return InOrder_search_recursive(node.rChild, key)
(Вам не нужен not None
проверку для поиска правой стороны, потому что, если она возвращает None
, у нас нет ничего, чтобы попробовать и только собираемся вернуться None
в любом случае.)
Если это двоичное дерево поиска, вы, вероятно, получите гораздо лучшие результаты с фактическим бинарным поиском вместо последовательного поиска. – user2357112
Да, вы правы, я только что понял, мы могли сначала определить это значение с помощью ключа ценности. Мы могли бы использовать свойство BST, чтобы сэкономить много времени. И затем найдите его левое поддерево. И немедленно возвращайтесь, если в его левом поддереве есть узел с ключом значения. – lexie