Kth Smallest Element in a BST
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?
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
解法一:递归中序遍历,必须全部遍历
/** * 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) { vector<int> ret; inOrder(root, ret); return ret[k-1]; } void inOrder(TreeNode* root, vector<int>& ret) { if(root) { inOrder(root->left, ret); ret.push_back(root->val); inOrder(root->right, ret); } } };
解法二:迭代中序遍历,遍历到第k个元素停止
/** * 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) { vector<int> ret; stack<TreeNode*> stk; stk.push(root); TreeNode* cur = root; while(cur->left) { stk.push(cur->left); cur = cur->left; } while(!stk.empty()) { TreeNode* top = stk.top(); stk.pop(); ret.push_back(top->val); if(ret.size() == k) break; if(top->right) { TreeNode* cur = top->right; stk.push(cur); while(cur->left) { stk.push(cur->left); cur = cur->left; } } } return ret[k-1]; } };