题解 | 二叉搜索树的第k个节点

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <pthread.h>
class Solution {


    int count = 0; // this is the global count of current visited value
    TreeNode* ret = nullptr;

    void midOrder(TreeNode* proot, int k) {
        if (proot == nullptr || count > k) {
            return;
        }

        midOrder(proot->left, k);

        count++;

        if (count == k) {
            ret = proot;
        }

        midOrder(proot->right, k);

    }

public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param proot TreeNode类 
     * @param k int整型 
     * @return int整型
     */
    int KthNode(TreeNode* proot, int k) {
        // write code here
        // if (proot == nullptr)
        //     return -1;
        midOrder(proot, k);

        if (ret == nullptr)
            return -1;
        else 
            return ret->val;



    }
};

这段递归代码的逻辑很重要。

首先我们思考,这个是需要从最左下角开始标定的,但是因为数据结构中并不存在prev这样的指针,所以本身这个就不现实。

这个问题能用递归去解决,原因在于,他是一层套一层的,做到最左下角然后开始recursively bottom up,很符合recursion的原理。

我们开始设计,我们需要一个global的count去记录我遍历的点的个数,然后我根据要求,先遍历左边的点, 然后遍历右边的点,然后再看root node。

因此我们这个recursive function里,需要先对左边的做递归,#剑指offer#

** 这里的count++是对root的操作,左边归左边,右边归右边

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务