【发布时间】:2015-12-27 23:21:42
【问题描述】:
我一直在玩 BST(二叉搜索树),我想知道如何提前退出。以下是我为找到第 k 个最小而编写的代码。它递归地调用子节点的find_smallest_at_k,stack只是传递给函数的一个列表,用于按顺序添加所有元素。目前这个解决方案按顺序遍历所有节点,然后我必须从这个函数之外的“堆栈”中选择第 k 个项目。
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 个(有序)项的有效/优雅方法是什么。如果是这样,那么我建议你创建一个遍历树的迭代器,
yield按顺序排列值,然后有一个函数 get_kth 只在迭代器上循环,从中返回第 k 个结果。 -
@TomDalton - 问题主要是看看我是否可以巧妙地安排递归的基本情况以返回第 k 个最小的情况而不遍历所有节点。我同意更好的方法是使用迭代而不是递归,但是坚持使用递归是否有更有效的方法来做到这一点?我更多是出于好奇而问了这个问题。如果不抛出
Exception可能会展开所有堆栈帧,我想不出一种摆脱递归的方法。
标签: python recursion binary-search-tree exit