【LeetCode】230. Kth Smallest Element in a BST (2 solutions)

Kth Smallest Element in a BST

Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.

Note: 
You may assume k is always valid, 1 ≤ k ≤ BST's total elements.

Follow up:
What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?

Show Hint 

    Credits:
    Special thanks to @ts for adding this problem and creating all test cases.

     

    解法一:递归中序遍历,必须全部遍历

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int kthSmallest(TreeNode* root, int k) {
            vector<int> ret;
            inOrder(root, ret);
            return ret[k-1];
        }
        void inOrder(TreeNode* root, vector<int>& ret)
        {
            if(root)
            {
                inOrder(root->left, ret);
                ret.push_back(root->val);
                inOrder(root->right, ret);
            }
        }
    };

     

    解法二:迭代中序遍历,遍历到第k个元素停止

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int kthSmallest(TreeNode* root, int k) {
            vector<int> ret;
            stack<TreeNode*> stk;
            stk.push(root);
            TreeNode* cur = root;
            while(cur->left)
            {
                stk.push(cur->left);
                cur = cur->left;
            }
            while(!stk.empty())
            {
                TreeNode* top = stk.top();
                stk.pop();
                ret.push_back(top->val);
                if(ret.size() == k)
                    break;
                if(top->right)
                {
                    TreeNode* cur = top->right;
                    stk.push(cur);
                    while(cur->left)
                    {
                        stk.push(cur->left);
                        cur = cur->left;
                    }
                }
            }
            return ret[k-1];
        }
    };

    posted @ 2015-07-08 10:45  陆草纯  阅读(327)  评论(0编辑  收藏  举报