• LeetCode-Closest Binary Search Tree Value II


    Given a non-empty binary search tree and a target value, find k values in the BST that are closest to the target.

    Note:

    • Given target value is a floating point.
    • You may assume k is always valid, that is: k ≤ total nodes.
    • You are guaranteed to have only one unique set of k values in the BST that are closest to the target.

    Follow up:
    Assume that the BST is balanced, could you solve it in less than O(n) runtime (where n = total nodes)?

    Analysis:

    Use inorder traverse, put all predecessors into a stack, for every successor, put all pres that has smaller gap than that successor into resList and then put this successor into resList.

    Solution:

    /**
     * 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) {
            Stack<Integer> pres = new Stack<Integer>();
            LinkedList<Integer> resList = new LinkedList<Integer>();
            closestKValuesRecur(root,target,k,pres,resList);
            // If not enough in resList, put more pres into resList. This is because successor is too little.
            while (resList.size()<k && !pres.empty()){
                    resList.addFirst(pres.pop());
            }
            return resList;        
        }
    
        public void closestKValuesRecur(TreeNode curNode, double target, int k, Stack<Integer> pres, LinkedList<Integer> resList){
            if (curNode == null) return;
            if (resList.size()==k) return;
    
            // inorder traverse.
            closestKValuesRecur(curNode.left,target,k,pres,resList);
    
            // check curNode
            if (curNode.val >= target){
                while (resList.size()<k && !pres.empty() && target-pres.peek() < curNode.val-target){
                    resList.addFirst(pres.pop());
                }
                if (resList.size()<k){
                    resList.addLast(curNode.val);
                } else {
                    return;
                }
            } else {
                pres.push(curNode.val);
            }
    
            closestKValuesRecur(curNode.right,target,k,pres,resList);
        }
    }
  • 相关阅读:
    5、流程控制
    4、字典和元祖
    3、列表操作
    2、字符串和数据类型
    1.标识符练习
    使用xpath提取页面所有a标签的href属性值
    网页提取所有邮箱
    正则表达式
    提取包含QQ的文本为QQ邮箱
    python继承小demo
  • 原文地址:https://www.cnblogs.com/lishiblog/p/5836167.html
Copyright © 2020-2023  润新知