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

216 阅读1分钟

题目:
给你一个 二叉搜索树 的根节点 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]
}