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。。。