题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
思路
对于二叉搜索树,使用中序遍历就能得到排序好的序列;每次访问一个节点,计数-1;直到计数为0时返回。
代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
TreeNode* KthNode(TreeNode* pRoot, int k){
if(pRoot == nullptr || k<1)
return nullptr;
return find(pRoot, k);
}
TreeNode *find(TreeNode* pRoot, int &k){
if(pRoot == nullptr)
return nullptr;
TreeNode *left = find(pRoot->left,k);
if(left!= nullptr){
if(k==0) // 是0直接返回
return left;
--k;
}
if(--k == 0) // 注意这个地方要先减1再判断
return pRoot;
TreeNode *right = find(pRoot->right,k);
if(right!= nullptr){
if(k == 0)
return right;
--k;
}
return nullptr;
}
};