剑指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 };

 

posted @ 2020-07-30 15:27  __rookie  阅读(125)  评论(0编辑  收藏  举报