剑指Offer-54:二叉搜索树的第k大节点

题目:

给定一颗二叉搜索树,请找出其中的第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;
    }


};

你可能感兴趣的:(剑指Offer,剑指Offer,笔试面试,编程题)