272. Closest Binary Search Tree Value II

本文介绍了一种在二叉搜索树(BST)中寻找k个最接近目标值的方法,通过中序遍历并利用队列来维护最接近的k个值。此算法确保了时间复杂度为O(h),适用于需要高效查询的场景。

272. Closest Binary Search Tree Value II

题目链接:https://leetcode.com/problems...

bst的值大小顺序实际上就是满足inorder的条件,所以直接中序遍历,过程中维护一个queue,放入k个当前离target最近的值,queue的size=k时,新的值和target的距离如果小于队首的那个值和target的距离那么移除队首,如果size=k,且新的距离大于等于队首的距离,直接退出,返回队列中的所有结果。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> closestKValues(TreeNode root, double target, int k) {
        Queue<Integer> q = new LinkedList();
        TreeNode prev = null, cur = root;
        while(cur != null) {
            if(cur.left == null) {
                if(q.size() == k) {
                    if(Math.abs(q.peek() - target) <= Math.abs(cur.val - target)) break;
                    q.poll();
                }
                q.offer(cur.val);
                cur = cur.right;
            }
            else {
                prev = cur.left;
                while(prev.right != cur && prev.right != null) prev = prev.right;
                // connect the prev with current
                if(prev.right == null) {
                    prev.right = cur;
                    cur = cur.left;
                }
                // traverse to current node
                else {
                    prev.right = null;
                    if(q.size() == k) {
                        if(Math.abs(q.peek() - target) <= Math.abs(cur.val - target)) break;
                        q.poll();
                    }
                    q.offer(cur.val);
                    cur = cur.right;
                }
                
            }
        }
        
        return (List) q;
    }
}

按要求是要O(h)的时间复杂度。提示找pre和suc,那么分别找到离k最近的pre和suc就好了,bst里面找离最近的k的复杂度是O(h),这个过程中要把路上的node存下来,以便找pre和next。
参考discussion里的:
https://discuss.leetcode.com/...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值