Прежде чем спрашивать, я искал несколько старых вопросов и получил лучшую идею поместить «return» перед внутренней частью, повторно вызвав функцию, чтобы получить ожидаемый результат.некоторые из них, например: Как остановить рекурсию Python Операции рекурсии Python и оператор возврата .Но когда я делаю то же самое с моей проблемой, она ухудшается.
У меня есть дерево бинарного поиска, и я хочу получить экземпляр TreeNode по заданному ключу узла, так что это выглядит проще, и я ужелегко реализуемые аналогичные функции ниже, с помощью которых я НЕ ставлю return перед функцией:
#preorder_List=[]
def preorder(treeNode):
if treeNode:
preorder_List.append(treeNode.getKey())
preorder(treeNode.has_left_child())
preorder(treeNode.has_right_child())
return preorder_List
, поэтому для моего нового требования я сначала сочиняю его, как показано ниже:
def getNode(treeNode,key):
if(treeNode):
if(treeNode.key==key):
print("got it=",treeNode.key)
return treeNode
else:
getNode(treeNode.left_child(),key)
getNode(treeNode.right_child(),key)
затем возникает проблема, он находит ключ / узел, но продолжает работать и, наконец, сообщает об ошибке None, а затем я помещаю return перед левой и правой веткой, как показано ниже:
def getNode(treeNode,key):
if(treeNode):
if(treeNode.key==key):
print("got it=",treeNode.key)
return treeNode
else:
return getNode(treeNode.left_child(),key)
return getNode(treeNode.right_child(),key)
, но это делаетХуже того, он дошел до найденного ключа и возвратил None ранее.
Затем я попытался удалить один «возврат» для ветви, независимо от направления вправо или влево.Это работает (Обновление: это работало, когда мой тестовый случай содержит только 3 узла, когда я помещал больше узлов, это не работало, или чтобы сказать, если ожидаемый узел справа, тогда поставить return перед правым вызовом ветвления работает,для левого, это не так).Какое решение лучше?