Problem: 2476. 二叉搜索树最近节点查询


文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code


思路

找到所有节点然后再找满足要求的查询的值,一眼排序+二分,看了眼数据范围,满足O(nlogn)。

解题方法

dfs获取所有节点的值,然后二分查找,获得所有满足条件的值。

复杂度

时间复杂度: 2476. 二叉搜索树最近节点查询_复杂度 遍历查询2476. 二叉搜索树最近节点查询_复杂度_02+二分2476. 二叉搜索树最近节点查询_List_03

空间复杂度: 2476. 二叉搜索树最近节点查询_复杂度_02 n个节点,递归调用栈需要2476. 二叉搜索树最近节点查询_复杂度_02的空间,存储答案也是2476. 二叉搜索树最近节点查询_复杂度_02的空间。

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