BST 中的 floor 函数,这是实现还是我误解了它的用法?

Floor function in BST, Is this the Implementation or am i missunderstanding its use?

我正在自学一些数据结构,我想知道这是否是 BST 中 floor 函数的正确实现?我会切入正题...

def floor(self, key):
    if self.root == None:
        return False

    return self._floor(self.root, key)

def _floor(self, node, key):
    if key == node.key:
        return node

    if key < node.key:
        if node.left == None:
            return node

        return self._floor(node.left, key)

    if node.right == None:
        return node

    return self._floor(node.right, key)

以上是我实现该功能的方法,似乎工作正常。但是我写了一些单元测试,其中一个失败了。

def test_floor_NoLeftSubTree_HighestElementLowerThanValueReturned(self):
    # Arrange
    self.tree.insert(100)
    self.tree.insert(102)
    self.tree.insert(101)
    self.tree.insert(110)
    self.tree.insert(115)
    self.tree.insert(120)
    self.tree.insert(130)

    # Act, Assert
    self.assertEqual(self.tree.floor(109).key, 102)

我只是想澄清一下,我的理解是正确的。上面的测试失败了,因为它是 returning 110,而不是 102。我认为它应该 return 102。任何正确方向的推动都会有所帮助,谢谢...

我正在从 this 文档中学习。

编辑: 这就是我认为树应该看起来的样子。

                    100
                        102
                    101     110
                                115
                                    120
                                        130

当您的代码到达节点 102 时,它决定转到正确的子节点,即 110。但是 110 节点没有左子节点,例程 return 是当前节点 (110)。在这种情况下你应该 return "None" (因为这里没有 floor(109) 候选人),然后在上一级 return当前节点(即102):return self._floor(node.right, key) 如果不是None,return node 否则