zoukankan      html  css  js  c++  java
  • 剑指54 二叉搜索树的第k大节点

    给定一棵二叉搜索树,请找出其中第k大的节点。

    一开始没注意到是搜索树,用set的自动排序特定得出结果,时间复杂度应该是O(nlogn),总共n个节点,每次插入删除需要logn时间。

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     int kthLargest(TreeNode* root, int k) {
    13         if(!root) return 0;
    14         set<int,less<int>> s;
    15         queue<TreeNode*> q;
    16         q.push(root);
    17         while(!q.empty()){
    18             TreeNode* temp=q.front();q.pop();
    19             if(s.size()<k)
    20                 s.insert(temp->val);
    21             else{
    22                 if(temp->val>*s.begin()){
    23                     s.erase(s.begin());
    24                     s.insert(temp->val);
    25                 }
    26             }
    27             if(temp->left!=nullptr)
    28                 q.push(temp->left);
    29             if(temp->right!=nullptr)
    30                 q.push(temp->right);
    31         }
    32         return *s.begin();
    33     }
    34 
    35 };

    有二叉搜索树这个条件的话,因为二叉搜索树的中序遍历是递增序列,只要获取反向的递增序列就是从大到小了。

    只用先保存下来k,然后再没经过一个节点递减k,如果减完之后就设置ans然后返回;如果减之前就是0,直接返回。其余情况正常递归。

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 private:
    12     int ans;
    13     int k;
    14 public:
    15     int kthLargest(TreeNode* root, int k) {
    16         this->k=k;
    17         dfs(root);
    18         return ans;
    19     }
    20 
    21     void dfs(TreeNode* curNode){
    22         if(curNode==nullptr)
    23             return ;
    24         dfs(curNode->right);
    25         if(k==0) return;
    26         if(--k==0){
    27             ans=curNode->val;
    28             return ;
    29         }
    30         dfs(curNode->left);
    31     }
    32 };
  • 相关阅读:
    面向过程, 面向对象, 类和对象, 类与数据类型
    python函数
    简单的登录注册函数
    Java遍历包中所有类
    spring boot jar启动
    过期算法
    负载均衡算法
    spring boot druid mybatis多数据源
    多线程wait和notify实现1212
    多线程售票
  • 原文地址:https://www.cnblogs.com/rookiez/p/13404035.html
Copyright © 2011-2022 走看看