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