题解 | #牛牛的二叉树问题#

牛牛的二叉树问题

https://www.nowcoder.com/practice/1b80046da95841a9b648b10f1106b04e

/**
 * struct TreeNode {
 *  int val;
 *  struct TreeNode *left;
 *  struct TreeNode *right;
 *  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <functional>
#include <vector>
struct AbsCompare {
    static double target;
    bool operator()(int a, int b) const {
        return std::abs(a - target) < std::abs(b - target);
    }
};
class Solution {

  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @param target double浮点型
     * @param m int整型
     * @return int整型vector
     */



 
    vector<int> findClosestElements(TreeNode* root, double target, int m) {
        // write code here
        
        auto compare = [&target](int a, int b) {
                return abs(a-target) < abs(b-target); // 降序排列
        };
        priority_queue<int, std::vector<int>, decltype(compare)> minHeap(compare);
        function<void(TreeNode *)> dfs=[&minHeap,&m,&target ,&dfs](TreeNode * node){
             if (node) {
                
                double dist = abs(node->val - target);
                if (minHeap.size() < m) {
                    minHeap.push(node->val);
                } else {
                    // cout<<target<<'\t'<<maxHeap.top()<<'\t'<<node->val<<endl;
                    if (abs(minHeap.top() - target) > dist ) {
                        // cout<<maxHeap.top();
                        minHeap.pop();
                        minHeap.push(node->val);
                    }
                }
                dfs(node->left);
                dfs(node->right);
            }
        };
        dfs(root);

        vector<int> res;
        while (!minHeap.empty()) {
            res.push_back(minHeap.top());
            minHeap.pop();
        }
        sort(res.begin(), res.end());

        return res;
    }
};

使用最小堆来获取m个最小距离节点

全部评论

相关推荐

沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务