题目:
给你一个 二叉搜索树 的根节点 root ,和一个由正整数组成、长度为 n 的数组 queries 。
请你找出一个长度为 n 的 二维 答案数组 answer ,其中 answer[i] = [mini, maxi] :
mini是树中小于等于queries[i]的 最大值 。如果不存在这样的值,则使用-1代替。maxi是树中大于等于queries[i]的 最小值 。如果不存在这样的值,则使用-1代替。
返回数组 answer 。
算法:
思路:中序遍历数,得到升序数组,然后对每个元素二分查找,求上界和下界
func closestNodes(root *TreeNode, queries []int) [][]int {
list := make([]int, 0)
var dfs func(node *TreeNode)
dfs = func(node *TreeNode) {
if node == nil {
return
}
dfs(node.Left)
list =append(list, node.Val)
dfs(node.Right)
}
dfs(root)
fmt.Println(list)
ans := make([][]int, len(queries))
for i := range queries {
ans[i] = []int{searchLowBound(list, queries[i]), searchUpBound(list, queries[i])}
}
return ans
}
// 小于等于target的最大值
func searchLowBound(list []int, target int) int {
left, right := 0, len(list)-1
if target < list[left] {
return -1
}
for left < right {
mid := (left + right) / 2
if list[mid] == target {
return list[mid]
} else if list[mid] < target {
if mid + 1 == len(list) || target < list[mid + 1] {
return list[mid]
}
left = mid + 1
} else {
right = mid - 1
}
}
return list[left]
}
func searchUpBound(list []int, target int) (int) {
left, right := 0, len(list) - 1
if target > list[right] {
return -1
}
for left < right {
mid := (left + right) / 2
if list[mid] == target {
return list[mid]
} else if list[mid] > target {
if mid - 1 < 0 || list[mid - 1] < target {
return list[mid]
}
right = mid - 1
} else {
left = mid + 1
}
}
return list[left]
}