Problem :
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?
Example:
**
Algorithm:
**
根据二叉搜索树的性质,左子树<根节点<右子树,其实就是要我们中序遍历这个二叉树,我用的是非递归的中序遍历方法,我们可以根据这一特性从最小的节点即最左边的节点开始,即把所有左子树先入栈,先查询这个是第几小的节点,如果还不是第K小,那么就把他的右子树入栈,用同样的方法把这个右子树所有的左子树入栈。
该算法的复杂度跟二叉树的高度有关,最大时间复杂度是第一个while循环正好把最长的左子树列都入栈了,那么就是O(Height),
对于一个经常插入或删除的二叉树,我们可以在数据结构里添加一个属性来表示该节点左子树的所有节点,在插入或删除该节点时,我们需要更新该节点上面的所有节点的这个属性。然后再查询第K小的数的时候,只要比较这个K和节点的左子树的节点数,就可以判断这个数到底在节点的左子树里还是右子树里。
**
Code:
/**
* 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* > sta;
while(root!=NULL)
{
sta.push(root);
root=root->left;
}
while(k>0)
{
if(root==NULL)
{
root=sta.top();sta.pop();
if(--k==0)
return root->val;
root=root->right;
}
else
{
sta.push(root);
root=root->left;
}
}
return root->val;
}
};