题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
解题思路
设置一个计数器 count,从当前节点开始,我们先递归搜索当前节点的左子树,如果左子树中有第 k 小的节点,则递归搜索左子树的方法返回该节点,当前节点的总方法再返回该节点;
如果左子树中没有第 k 小的节点,则在当前节点的总方法中把计数器加1,并判断加1后的计数是否和 k 相等,如果相等,则返回当前节点;
否则,用类似递归搜索左子树的方法,递归搜索当前节点的右子树。
代码实现
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
private:
int count = 0;
public:
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(pRoot != NULL){
TreeNode* maybeKthNode = KthNode(pRoot->left, k);
if(maybeKthNode != NULL) return maybeKthNode;
count++;
if(count == k) return pRoot;
maybeKthNode = KthNode(pRoot->right, k);
if(maybeKthNode != NULL) return maybeKthNode;
}
return NULL;
}
};
运行结果
运行时间:2ms
占用内存:492k