题目:
给定一颗二叉搜索树,请找出其中的第k大的结点。
例子:
5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
链接:
剑指Offer(第2版):P269
思路标签:
- 算法:中序遍历
解答:
寻求高效的时间效率和空间效率
- 对二叉搜索树使用中序遍历查找即可。注意传递k值的引用。
/*
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 == 0)
return nullptr;
return KthNodeCore(pRoot, k);
}
TreeNode* KthNodeCore(TreeNode* pRoot, int& k){
TreeNode* target = nullptr;
if(pRoot->left != nullptr)
target = KthNodeCore(pRoot->left, k);
if(target == nullptr){
if(k == 1)
target = pRoot;
k--;
}
if(target == nullptr && pRoot->right != nullptr)
target = KthNodeCore(pRoot->right, k);
return target;
}
};