【发布时间】:2021-08-25 16:08:32
【问题描述】:
我一直在努力解决一个代码问题,我必须在二叉搜索树中找到给定数字的下限和上限。例如,给出 5,所以程序应该打印 4 代表地板,6 代表天花板(如果它们存在)。否则,它应该为每个都打印 None。
下面是一个示例代码来解释:
class Node:
def __init__(self, value):
self.left = None
self.right = None
self.value = value
def findCeilingFloor(root_node, k, floor=None, ceil=None):
# Fill this in.
root = Node(8)
root.left = Node(4)
root.right = Node(12)
root.left.left = Node(2)
root.left.right = Node(6)
root.right.left = Node(10)
root.right.right = Node(14)
print findCeilingFloor(root, 5)
# (4, 6)
我为 findCeilingFloor 函数实现了一些代码。虽然它找到并分配了下限和上限值,但当程序返回到包含 12 作为值的节点时,它再次将下限和上限值更改为无。因此,它总是为它们返回 None 。我添加了一些打印语句来跟踪正在发生的事情。
这是我的输出:
这是我的实现:
def findCeilingFloor(root_node, k, floor=None, ceil=None):
# Fill this in.
print(f"Current node value = {root_node.value}")
print(f"Floor value = {floor}")
print(f"Ceil value = {ceil}")
print()
if root_node.value == k - 1:
floor = root_node.value
if root_node.value == k + 1:
ceil = root_node.value
if root_node.left:
findCeilingFloor(root_node.left, k, floor, ceil)
if root_node.right:
findCeilingFloor(root_node.right, k, floor, ceil)
return floor, ceil
我不明白为什么我的代码对它们都返回 None,即使它同时找到了 floor 和 ceil 值(ceil 值没有出现在输出中,因为它在分配 ceil 之前打印,我检查它是否也找到了 ceil)。当左子树上没有节点可走时,直接到右子树,到 12,然后 floor 和 ceil 都变为 None。
【问题讨论】:
-
这能回答你的问题吗? Recursive function returning none in Python
-
TL;DR:用
return findCeilingFloor(root_node.left, k, floor, ceil)替换findCeilingFloor(root_node.left, k, floor, ceil) -
不,实际上,在您的问题中,它可能比这稍微复杂一些。
-
将
findCeilingFloor(root_node.left, k, floor, ceil)替换为floor = findCeilingFloor(root_node.left, k, floor, ceil),将findCeilingFloor(root_node.right, k, floor, ceil)替换为ceil = findCeilingFloor(root_node.right, k, floor, ceil) -
地板和天花板是什么意思?您的代码似乎专门寻找
k-1和k+1的值,这可以通过简单的搜索来完成。
标签: python oop recursion binary-tree binary-search-tree