Problem: 2476. 二叉搜索树最近节点查询
文章目录
- 思路
- 解题方法
- 复杂度
- Code
思路
找到所有节点然后再找满足要求的查询的值,一眼排序+二分,看了眼数据范围,满足O(nlogn)。
解题方法
dfs获取所有节点的值,然后二分查找,获得所有满足条件的值。
复杂度
时间复杂度: O ( n l g n ) O(nlgn) O(nlgn) 遍历查询 O ( n ) O(n) O(n)+二分 O ( l g n ) O(lgn) O(lgn)
空间复杂度: O ( n ) O(n) O(n) n个节点,递归调用栈需要 O ( n ) O(n) O(n)的空间,存储答案也是 O ( n ) O(n) O(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 - 1while l < r:mid = l + r + 1 >> 1if nodes_lis[mid] <= q:l = midelse:r = mid - 1if 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 >> 1if nodes_lis[mid] >= q:r = midelse:l = mid + 1if nodes_lis[l] >= q:tem.append(nodes_lis[l])else:tem.append(-1) answers_lis.append(tem)return answers_lis