[剑指Offer]54-二叉搜索树的第k个节点

题目描述

给定一棵二叉搜索树,找出其中的第k小的结点,返回指向该节点的指针。

思路

中序遍历即可。
注意特判!报段错误数组越界这里就要考虑是少特判的问题。

法一:借助vector
法二(better)(学习的牛客网最佳解法):到第k个直接返回。
关键是理解:

if (pNode != nullptr) {
    return pNode;
}

有了这句话,当遍历到第k小的节点时,返回该节点指针,并会一路传出来。没有的话,则只是传给上层父节点,后续会被覆盖。
当未到第k个时,(node接收的)返回值一直是空。到第k个后,一旦返回了root,那么node就不会为空了,就一直一层层的递归出去到结束了。

代码

法一:

/*
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 == NULL || k <= 0) {//注意k=0
            return NULL;
        }
        vector<TreeNode*> vec;
        inorderTravel(pRoot,vec);
        if((size_t) k>vec.size()) {//注意
            return NULL;
        }
        return vec[k - 1];
    }

private:
    void inorderTravel(TreeNode* pRoot,vector<TreeNode*>& vec) {
        if (pRoot == NULL) {
            return;
        }
        else {
            inorderTravel(pRoot->left,vec);
            vec.push_back(pRoot);
            inorderTravel(pRoot->right,vec);
        }
    }
};
   

法二:

class Solution {
public:
    int cnt = 0;
    TreeNode* KthNode(TreeNode* pRoot, int k)
    {
        if (pRoot != nullptr) {
            TreeNode* pNode=KthNode(pRoot->left, k);
            if (pNode != nullptr) {
                return pNode;
            }
            cnt++;
            if (cnt == k) {
                return pRoot;
            }
            pNode = KthNode(pRoot->right, k);
            if (pNode != nullptr) {
                return pNode;
            }
        }
        return nullptr;
    }
};

猜你喜欢

转载自www.cnblogs.com/coding-gaga/p/10460383.html