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?
Hint:
- Try to utilize the property of a BST.
- What if you could modify the BST node's structure?
- The optimal runtime complexity is O(height of BST).
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
stack<TreeNode*> stack;
TreeNode * p=root;
int result;
int count=k;
while((!stack.empty() || p!=NULL)){
if(p!=NULL){
stack.push(p);
p=p->left;
}else{
count--;
if(count==0){
break;
}
p=stack.top();
stack.pop();
p=p->right;
}
}
result =stack.top()->val;
return result;
}
};
这题我的做法其实就是为了中序遍历加了一个计数器。然后就能记录下来BST中的元素大小了。
但是这题的思考部分是要为结点添加子树的大小这个数据。
感觉和非递归遍历BST比谁快?
虽然如果事先就有子树的大小的话确实是O(树高)