二叉搜索树中第K小的元素
分析:
BST的中序遍历。
代码:
/**
* 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:
int cnt = 0, res = 0;
void dfs(TreeNode* root, int k) {
if(root) {
dfs(root->left, k);
++cnt;
if(cnt == k) {
res = root->val;
}
dfs(root->right, k);
}
}
int kthSmallest(TreeNode* root, int k) {
dfs(root, k);
return res;
}
};
二叉搜索树迭代器
方法一:
对二叉搜索树进行中序遍历,将遍历结果保存在数组中,然后针对数组设计迭代器。
代码:
方法二:
迭代:利用栈来实现中序遍历,详情请见:栈实现二叉树的前序、中序和后序遍历。
代码:
/**
* 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 BSTIterator {
private:
TreeNode* cur;
stack<TreeNode*> stk;
public:
BSTIterator(TreeNode* root): cur(root) {}
int next() {
while (cur != nullptr) {
stk.push(cur);
cur = cur->left; //最左下的结点
}
//中序遍历为LDR,cur没有左孩子,因此直接访问
cur = stk.top();
stk.pop();
int ret = cur->val;
cur = cur->right; //指向下一个待访问的结点
return ret;
}
bool hasNext() {
return cur != nullptr || !stk.empty();
}
};
/**
* Your BSTIterator object will be instantiated and called as such:
* BSTIterator* obj = new BSTIterator(root);
* int param_1 = obj->next();
* bool param_2 = obj->hasNext();
*/