给定一个二叉搜索树的根节点 root
,和一个整数 k
,请你设计一个算法查找其中第 k
小的元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1 输出:1
AC
对比上一题稍加改进
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
vector<int> ans;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
int count=q.size();
TreeNode* node=nullptr;
int n=0;
while(count--){
node=q.front();
q.pop();
//sum+=node->val;
ans.push_back(node->val);
n++;
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
//int jieguo=100010;
sort(ans.begin(), ans.end());
// int n=ans.size();
// for(int i=0;i<n-1;i++){
// jieguo=min(jieguo,ans[i+1]-ans[i]);
// }
return ans[k-1];
}
};
正常思路题解(利用二叉搜索树的性质)
变成了一个长链表k为索引
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;
}
};