python - 在二叉搜索树中查找地板和天花板
问题描述
我一直在努力解决一个代码问题,我必须在二叉搜索树中找到给定数字的下限和上限。例如,给出了 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。
解决方案
您的代码存在一个主要问题。
将参数传递给函数并不像你想象的那样工作
看下面的代码并尝试猜测输出,然后与实际输出进行比较:
def f(x):
g(x)
return x
def g(x):
x = 3
print(f(4))
那么,是输出3
,还是4
?自己试试。事实证明,函数g
不会修改f
变量x
。x = 3
主体中的语句g
分配了一个名为的局部变量x
,该变量与f
's 不同。
修复代码
def findCeilingFloor(root_node, k):
# Fill this in.
print(f"Current node value = {root_node.value}")
print(f"Floor value = {floor}")
print(f"Ceil value = {ceil}")
print()
floor, ceil = None, None
if root_node.value == k - 1:
floor = root_node.value
elif root_node.left:
floor = findCeilingFloor(root_node.left, k, floor, ceil)
if root_node.value == k + 1:
ceil = root_node.value
elif root_node.right:
ceil = findCeilingFloor(root_node.right, k, floor, ceil)
return floor, ceil
另一个问题: floor 和 ceil 的含义
很可能还有另一个问题。您可能误解了“地板”和“天花板”应该是什么。你确定那些指的是价值观k-1
吗k+1
?您正在寻找的可能是对于 floor小于k
tree中的最大值,对于 ceil是大于tree 中的最小值。k
推荐阅读
- c# - 如何使用cultureInfo 获取国家名称并进行翻译?
- python - 跨列删除具有相同单元格值的任何行
- python - aws lambda:如何使用 chromium-headless “DevToolsActivePort 文件不存在”修复错误
- google-apps-script - 如何在 GAS 中比较 alasql 中的日期?
- posix - nftw的功能替换
- c# - 上下文菜单项必须单击两次才能消失
- python-3.x - 如何使用 lxml 设置 xsi:nil="true"
- version-control - 为什么 Source Safe 2005 在 Project Differences 中显示所有项目文件夹?
- flutter - 是否有可能 - 在 Flutter Web 应用程序中插入 google AdSense?
- android - 从设备分辨率获取 webview 分辨率