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
to10^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 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
k--
,跑到k == 0
的時候將該節點的值取出即可。
/**
* 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;
}
};
LeetCode
C++