1. 程式人生 > >劍指offer:二叉搜尋樹的第k個結點

劍指offer:二叉搜尋樹的第k個結點

題目描述

給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。

遞迴

/*
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, unsigned int k) { if (pRoot == NULL || k == 0){ return NULL; } return helper(pRoot, k); } private: TreeNode* helper(TreeNode* pRoot, unsigned int& k){ TreeNode* res = NULL; if (pRoot->left){ // res=
helper(pRoot->left, k); } if (pRoot){ if (res == NULL){ if (k == 1){ res = pRoot; } k--; } } //res==NULL就不用再遞迴 if (res==NULL && pRoot->right!=NULL){ //
res=helper(pRoot->right, k); } return res; } };

非遞迴

/*
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, unsigned int k)
    {
        if (pRoot == NULL || k == 0){
            return NULL;
        }

        stack<TreeNode*> stk;
        TreeNode* p = pRoot;

        int index = 0;
        TreeNode* res=NULL;

        while (p != NULL || !stk.empty()){
            while (p){
                stk.push(p);
                p = p->left;
            }

            //這裡是if,不是while
            if (!stk.empty()){
                p = stk.top();
                stk.pop();

                index++;

                if (index == k){
                    res = p;
                    break;
                }

                //不用判斷p->right是否為空
                p = p->right;
            }

        }

        return res;
    }
};