天天看點

劍指offer——二叉搜尋樹的第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;
        vector<TreeNode*> visit;
        DFS(pRoot,visit);
        for(int i=0;i<visit.size();i++){
            if(i==k-1)
                return visit[i];
        }
        return nullptr;
    }
    void DFS(TreeNode* pRoot,vector<TreeNode*> &visit){
        if(pRoot==nullptr)
            return ;
        DFS(pRoot->left,visit);
        visit.push_back(pRoot);
        DFS(pRoot->right,visit);
    }
};      
/*
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<1)
            return nullptr;
        TreeNode* res=nullptr;
        DFS(pRoot,res,k);
        return res;
    }
    void DFS(TreeNode* pRoot,TreeNode* &res,int &k){
        if(pRoot==nullptr||k<1)
            return ;
        DFS(pRoot->left,res,k);
        --k;
        if(k==0){
            res=pRoot;
            return ;
        }
        DFS(pRoot->right,res,k);
    }
};