题目
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
来源:力扣(LeetCode)
链接:link
示例
题解
一.deep first search
1.1思路
这个二叉树是排过序的,root->left,root,root->right值依次增加。
所以用dfs的中部遍历即可按照数的大小顺序遍历。
第k次访问即为第k大的数
1.2复杂度
时间:O(n)
空间:O(n)
1.3代码
递归
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
cnt=0;
dfs(root,k);
return ans;
}
void dfs(TreeNode* &root, int k)
{
if(root==NULL)
return ;//回到上一个节点
dfs(root->left,k);
if(++cnt==k)//访问该节点
ans=root->val;
}
dfs(root->right,k);
return ;
}
private: int cnt;
int ans;
};
用栈当线索进行遍历
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
TreeNode* cur;
stack<TreeNode*>s;
cur=root;
s.push(root);
int cnt(0);
while(!s.empty()||cur!=NULL)
{
while(cur!=NULL)
{
s.push(cur); //栈像个索引,帮你找回上个节点
cur=cur->left;//空的left/right未进栈
}
cur=s.top();
s.pop();//删掉了root,栈顶是前一个root,等待遍历;
if(++cnt==k)
return cur->val;
cur=cur->right;
}
return 10000000000;
}
};