Given a binary search tree, write a function kthSmallest
to find the kth smallest element in it.
Note:
You may assume k is always valid, 1 ≤ k ≤ BST's total elements.
Follow up:
What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?
思路:
1.利用二叉树的排序
2.遍历所有,查找第k小的数
代码1:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
stack<TreeNode *> st;
TreeNode *p = root;
while(p || !st.empty())
{
while(p)
{
st.push(p);
p = p->left;
}
p = st.top();
if(--k == 0)
return p->val;
st.pop();
p = p->right;
}
}
};
代码2:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> helper(TreeNode* root,vector<int> res){
if(root->left==root->right){
res.push_back(root->val);
return res;
}
if(root->left){res=helper(root->left,res);}
if(root->right){res=helper(root->right,res);}
res.push_back(root->val);
return res;
}
int kthSmallest(TreeNode* root, int k) {
vector<int> res;
res=helper(root,res);
nth_element(res.begin(), res.begin()+k-1, res.end());
return res[k-1];
}
};
代码3:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void kthSmallest(TreeNode* root, int& k, int& value) {
if (root) {
kthSmallest(root->left, k, value);
if (k>0) {
if (--k==0) value = root->val;
else kthSmallest(root->right, k, value);
}
}
}
int kthSmallest(TreeNode* root, int k) {
int val;
kthSmallest(root, k, val);
return val;
}
};