给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。
本题我原本的思路是将所有的节点按大小存入数组中,然后返回第k个值。代码如下:
class Solution {
public:
vector<int> res;
void traveral(TreeNode* cur) {
if(cur == nullptr) return;
if(cur->left) traveral(cur->left);
res.push_back(cur->val);
if(cur->right) traveral(cur->right);
return;
}
int kthSmallest(TreeNode* root, int k) {
traveral(root);
return res[k - 1];
}
};
但我们可以不遍历整棵树,使用中序遍历(迭代算法),使用栈存放节点。首先向左子树遍历,遍历到root为空,然后回溯,再遍历右子树,这样保证了迭代数值的大小。代码如下:
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
stack<TreeNode *> stack;
while (root != nullptr || stack.size() > 0) {
while (root != nullptr) {
stack.push(root);
root = root->left;
}
root = stack.top();
stack.pop();
--k;
if (k == 0) {
break;
}
root = root->right;
}
return root->val;
}
};