这是最近一次采访问题 . 要求查找 [x, y]
范围内包含的BST最大子树的大小的问题是 x < y
. BST是递归定义的,其中每个节点具有整数值,左子节点和右子节点 . 我只能在树中的节点总数位于该范围内但无法找到最大的子树 . 这是我在python中使用的代码:
def solution(x, y, T):
if T is None:
return 0
size = 0
if x < T.val:
size += solution(x, y, T.left)
if x <= T.val and y >= T.val:
size += 1
# The following if statement was my attempt at resetting the count
# whenever we find a node outside the range, but it doesn't work
if x > T.val or y < T.val:
size = 0
if B > T.x:
size += solution(A, B, T.right)
return size
解决方案应该是 O(N)
,其中 N
是树中的节点数 .
3 回答
假设我们的size函数返回
-1
表示无效子树 . 如果节点的值和其子树中的所有值都在范围内,则(子)树有效 .我们可以递归地解决问题 . 我们需要知道每个子树的左边界和右边界(即最小和最大的元素) . 如果它位于[x,y]范围内,我们可以用当前子树的总大小更新答案 . 下面是一些代码(
solution
函数在答案之上返回一个带有一些额外信息的元组 . 如果只是希望它返回范围内最大子树的大小,你可以将它包装起来并将其用作辅助函数) .该解决方案明确地以线性时间运行,因为它仅访问每个节点一次并且每个节点执行恒定数量的操作 .
对于BST中的每个节点,您可以关联它的有效范围
[Li,Ri]
,这意味着该节点的子树中的所有元素都位于有效范围内 .您可以通过递归方式轻松定义这些范围:
对于节点
i
,假设范围是[Li, Ri]
,并且此节点中存储的值是val
. 对于i
的左子,范围是[Li, val − 1]
. 同样对于正确的孩子,范围是[val + 1, Ri]
.对于根节点,有效范围是
[−inf, inf]
.