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

 
func closestNodes(root *TreeNode, queries []int) [][]int {
	var arr []int
	var dfs func(root *TreeNode)
	dfs = func(root *TreeNode) {
		if root == nil {
			return
		}
		dfs(root.Left)
		arr = append(arr, root.Val)
		dfs(root.Right)
	}
	dfs(root)
 
	ans := make([][]int, len(queries))
	for i, query := range queries {
		ans[i] = []int{-1, -1}
		max := maxi(arr, query)
		if max != len(arr) {
			ans[i][1] = arr[max]
		}
		if max == len(arr) || arr[max] != query {
			min := max - 1
			if min >= 0 {
				ans[i][0] = arr[min]
			}
		} else {
			ans[i][0] = arr[max]
		}
	}
	return ans
}
 
func maxi(arr []int, query int) int {
	l, r := 0, len(arr)-1
	for l <= r {
		mid := l + (r-l)/2
		if arr[mid] < query {
			l = mid + 1
		} else {
			r = mid - 1
		}
	}
	return l
}