Я играл с BST (двоичное дерево поиска), и мне интересно, как сделать ранний выход. Ниже приведен код, который я написал, чтобы найти kth самый маленький. Он рекурсивно вызывает дочерний узел find_smallest_at_k, а стек - это список, который передается в функцию, чтобы добавить все элементы inorder. В настоящее время это решение обрабатывает все узлы inorder, а затем я должен выбрать k-й элемент из «стека» вне этой функции.Python recursion - как выйти с раннего
def find_smallest_at_k(self, k, stack, i):
if self is None:
return i
if (self.left is not None):
i = self.left.find_smallest_at_k(k, stack, i)
print(stack, i)
stack.insert(i, self.data)
i += 1
if i == k:
print(stack[k - 1])
print "Returning"
if (self.right is not None):
i = self.right.find_smallest_at_k(k, stack, i)
return i
Это называется так,
our_stack = []
self.root.find_smallest_at_k(k, our_stack, 0)
return our_stack[k-1]
Я не уверен, если это возможно, чтобы выйти рано из этой функции. Если мой k говорит 1, мне действительно не нужно ходить по всем узлам, а затем найти первый элемент. Он также не имеет права передавать список из внешней функции - чувствует, как передать указатели на функцию в C. Может ли кто-нибудь предложить лучшие альтернативы, чем то, что я сделал до сих пор?
Я не на 100% уверен, что вы спрашиваете, но я думаю, что ваш вопрос: «Каков эффективный/элегантный способ найти k'th (упорядоченный) элемент в двоичном дереве поиска.Если это так, я бы предложил вам создать итератор, который ходит по дереву, «выдает значения по порядку, а затем имеет функцию get_kth, которая просто петли на итераторе, возвращая из нее k-й результат. –
@TomDalton - Вопрос был в основном в том, чтобы понять, могу ли я как-то ухитрить базовый регистр в рекурсии, чтобы вернуть k-е наименьшее, не пройдя все узлы. Я согласен с тем, что лучший подход - использовать итерацию, а не рекурсию, но придерживаться рекурсии на минуту - есть ли более эффективный способ сделать это? Я задал этот вопрос больше из любопытства. Я не могу придумать, как выйти из рекурсии, не выбрасывая «Исключение», возможно, чтобы раскрутить все кадры стека. – opensourcegeek