leetcode-230-Kth Smallest Element in a BST

来源:互联网 发布:沙迪克慢走丝编程 编辑:程序博客网 时间:2024/06/02 04:11

                                    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?

找出一个二叉排序树中第k小的数。


中序遍历二叉排序树,将元素存在数组中,数组中的第K个数就是第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:    void zhongxu(TreeNode* root,int* a,int& i){        if(!root) return;        zhongxu(root->left,a,i);        a[i++]=root->val;        zhongxu(root->right,a,i);    }    int kthSmallest(TreeNode* root, int k) {        int a[10000];        int i=1;        zhongxu(root,a,i);        return a[k];    }};


也可以不使用数组,直接找到第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:    void zhongxu(TreeNode* root,int& i,int& ans,int k){        if(!root) return;        zhongxu(root->left,i,ans,k);                if(i++==k) ans=root->val;// i==k 时, 将答案存在来                zhongxu(root->right,i,ans,k);    }    int kthSmallest(TreeNode* root, int k) {        int i=1,ans;        zhongxu(root,i,ans,k);        return ans;    }};




非递归

/** * 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>v;        stack<TreeNode*>s;        TreeNode* p;                s.push(root);        while(!s.empty()){            while(p=s.top())  // 向左走到尽头                 s.push(p->left);            s.pop();// 空指针出栈            if(!s.empty()){                p=s.top();//取栈顶元素                s.pop();//栈顶元素出栈                v.push_back(p->val);//加到向量vector中                s.push(p->right);            }        }        return v[k-1];    }};





1 0
原创粉丝点击