Problem: 2476. 二叉搜索树最近节点查询
文章目录
- 思路
- 解题方法
- 复杂度
- Code
思路
找到所有节点然后再找满足要求的查询的值,一眼排序+二分,看了眼数据范围,满足O(nlogn)。
解题方法
dfs获取所有节点的值,然后二分查找,获得所有满足条件的值。
复杂度
时间复杂度: 遍历查询+二分
空间复杂度: n个节点,递归调用栈需要的空间,存储答案也是的空间。
Code
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def closestNodes(self, root: Optional[TreeNode], queries: List[int]) -> List[List[int]]:
# 排序+二分
nodes_lis = [] # 获取所有节点
def dfs(node):
if not node: return
nodes_lis.append(node.val)
if node.left: dfs(node.left)
if node.right: dfs(node.right)
dfs(root)
nodes_lis.sort() # 升序
n = len(nodes_lis)
answers_lis = []
for q in queries:
tem = []
l, r = 0, n - 1
while l < r:
mid = l + r + 1 >> 1
if nodes_lis[mid] <= q:
l = mid
else:
r = mid - 1
if nodes_lis[l] <= q:
tem.append(nodes_lis[l])
else:
tem.append(-1)
r = n - 1 # 无需l=0,因为大于等于q的值必定在小于等于q的值的右边
while l < r:
mid = l + r >> 1
if nodes_lis[mid] >= q:
r = mid
else:
l = mid + 1
if nodes_lis[l] >= q:
tem.append(nodes_lis[l])
else:
tem.append(-1)
answers_lis.append(tem)
return answers_lis