给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出:1
示例 2:
输入: root = [3,1,4,null,2], k = 1
5
/ \
3 6
/ \
2 4
/
1
输出:3
备注:利用二叉搜索树的性质,按照中序遍历就是从小到大的顺序排列,那么就可以使用一个stack先存储左节点,当左节点为空时,取出栈顶元素,判定当前是第几小的元素,如果不是第k小,那么就继续搜索第k小元素,拿此栈顶元素的右节点再次将其左节点元素压栈,直到找到第k小的元素为止。
/**
* 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 kthSmallest(TreeNode* root, int k) {
if(root == nullptr)
return 0;
stack<TreeNode *> s;
TreeNode * pCurNode = root;
int nNum = 0;
while(!s.empty() || pCurNode)
{
if(pCurNode)
{
s.push(pCurNode);
pCurNode=pCurNode->left;
}
else
{
TreeNode * pNode = s.top();
s.pop();
nNum++;
if(nNum==k)
return pNode->val;
pCurNode = pNode->right;
}
}
return 0;
}
};