# 【LeetCode】 230. Kth Smallest Element in a BST
## Description
> Given a binary search tree, write a function `kthSmallest` to find the kth smallest element in it.
> 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?
> Constraints:
> * The number of elements of the BST is between `1` to `10^4`.
> * You may assume `k` is always valid, `1 ≤ k ≤ BST's total elements`.
> 給予一個二元搜索樹(BST),寫一個程式`kthSmallest`可以找出裡面第k小的元素。
> 進階:
> 如果這個BST很常被更改(插入/刪除),且你也很常需要找到第k小的元素該怎麼辦?你可以優化到常數時間內嗎?
> 限制:
> * BST中的元素介於`1`到`10^4`之間。
> * 你可以假設`k`總是合法,`1 ≤ k ≤ BST's total elements`。
## Example:
```
Example 1:
Input: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
Output: 1
Example 2:
Input: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
Output: 3
```
## Solution
* BST中如果要照大小去遍歷,只要跑中序遍歷即可。
* 因此我們只要跑中序,每次將`k--`,跑到`k == 0`的時候將該節點的值取出即可。
---
* 進階題還沒有研究,先跳過。
### Code
```C++=1
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void InorderTraversal(TreeNode* node, int& k, int& ans)
{
if(ans != -1)
return;
if(node)
{
InorderTraversal(node->left, k, ans);
k--;
if(k == 0) ans = node->val;
InorderTraversal(node->right, k, ans);
}
}
int kthSmallest(TreeNode* root, int k) {
int ans = -1;
InorderTraversal(root, k, ans);
return ans;
}
};
```
###### tags: `LeetCode` `C++`