Recursion BST顺序递归:查找第一个';s大于K
我的代码似乎一直运行到最后(因此不返回任何值),而不是在找到子树时停止Recursion BST顺序递归:查找第一个';s大于K,recursion,binary-search-tree,tree-traversal,inorder,Recursion,Binary Search Tree,Tree Traversal,Inorder,我的代码似乎一直运行到最后(因此不返回任何值),而不是在找到子树时停止 def first_greater_than_k(tree, k): if not tree: return None first_greater_than_k(tree.left, k) if tree.data > k: return tree first_greater_than_k(tree.right, k) 这是因为在
def first_greater_than_k(tree, k):
if not tree:
return None
first_greater_than_k(tree.left, k)
if tree.data > k:
return tree
first_greater_than_k(tree.right, k)
这是因为在first\u大于\u k函数中没有返回任何值。此外,如果您有一个BST(二进制搜索树),那么您可以比线性搜索做得更好 问题:在遍历树时查找第一个大于K的节点
def first_大于_k(树,k):
如果不是树:
一无所获
如果tree.data>k:
回归树
返回第一个大于k的树(tree.right,k)
您不需要递归树的左子级,因为存储在树中的值总是低于树的值。运行时间是O(h)
,其中h
是树的高度
另外,一个更有用的问题是(也许这就是你问的,但我们没有得到):如果按顺序遍历,则查找第一个大于K的节点 我们可以使用《算法导论》(Cormen,第287页)第3版中所述值的BST属性来解决该问题: 设x是二叉搜索树中的一个节点。如果y是左子树中的节点 先是x,然后是y≤ x、 钥匙。如果y是x的右子树中的节点,则 y、 钥匙≥ x、 钥匙
def first_大于_k(树,k):
如果不是树:
一无所获
如果k
此代码的运行时间也为
O(h)
,其中h
是树的高度。没有递归的原始答案:
def first_greater_than_k(tree, k):
subtree, first_so_far = tree, None
while subtree:
if subtree.data > k:
first_so_far, subtree = subtree, subtree.left
else:
subtree = subtree.right
return first_so_far
根据代码,我可以猜测您想要返回
根的值大于K
在这种情况下,您可以使用正确的减半方法来提高搜索运行时的复杂性。其思想是,将树分成两半,并根据K的值选择正确的对半
注意:我不知道您使用的语言,请忽略语法错误
def first_greater_than_k(tree, k):
if not tree:
return None
if tree.data < k
return first_greater_than_k(tree.left, k)
if(tree.data > k)
return tree;
return first_greater_than_k(tree.right, k)
def first_大于_k(树,k):
如果不是树:
一无所获
如果tree.datak)
回归树;
返回第一个大于k的树(tree.right,k)
总体运行时复杂度为O(logn),其中N是树中的节点数。谢谢!我有第二版,我在第57页找到了:)。你说得对,问题是按顺序遍历。我在寻找递归解决方案,只是为了更好地理解递归。不管怎样,你的回答真的很有帮助。非常感谢。这是什么编程语言?它是python。。。