61二叉搜索树的第k个结点

题目描述

给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
思路:二叉搜索树的中序遍历是递增的序列,使用循环的中序遍历找到第k个节点就行了,对中序遍历的循环版本没理解,使用一个stack,找到最左边的节点,所以初始化的时候首先初始化节点,stack要为空。计数的cnt要初始化为0。不清楚的话就一个节点的时候判断一下,然后p = p->right,不需要判断为空,因为为空的话,上面的循环不会进入。
/*
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){
            return nullptr;
        }
        stack<TreeNode*> s;  
        //s.push(pRoot);
        TreeNode* p = pRoot;
        int cnt = 0;
        while(!s.empty() || p != nullptr){
            while(p != nullptr){
                s.push(p);
                p = p->left;
                              
            }
            if(!s.empty()){
                p = s.top();
                s.pop();                
                ++cnt;
                if(cnt == k){
                    return p;
                }                 
                p = p->right; 
            }
        }
        return nullptr;
    }    
};

 

posted @ 2018-01-18 16:43  zqlucky  阅读(165)  评论(0编辑  收藏  举报