紧接着笔者又刷了一道题,这道题的思路很清晰,下面就和大家分享一下经验吧!
题目如下:
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.
Example 1:
Input: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
Output: 1
Example 2:
Input: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
Output: 3
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个元素返回即可。
解题代码如下:
class Solution{
public:
int kthSmallest(TreeNode* root, int k){
if(root==NULL)
return 0;
vector<int> v;
Inorder(root,v);
return v[k-1];
}
void Inorder(TreeNode* root, vector<int>& v){
if(root!=NULL)
{
Inorder(root->left, v);
v.push_back(root->val);
Inorder(root->right, v);
}
}
};
提交后的结果如下:
方法二(中序遍历_非递归法)
该方法中用的是三种遍历方式通用的非递归法,所以需要新建一个结构体Instruction。
解题代码如下:
struct Instruction{
string s;
TreeNode* node;
Instruction(string s, TreeNode* node): s(s), node(node){}
};
class Solution{
public:
int kthSmallest(TreeNode* root, int k){
if(root==NULL) return 0;
vector<int> v;
stack<Instruction> s;
s.push(Instruction("Go", root));
while(!s.empty()){
Instruction instruction = s.top();
s.pop();
if (instruction.s == "Out") v.push_back(instruction.node->val);
else{
if(instruction.node->right) s.push(Instruction("Go", instruction.node->right));
s.push(Instruction("Out", instruction.node));
if(instruction.node->left) s.push(Instruction("Go", instruction.node->left));
}
}
return v[k-1];
}
};
提交后的结果如下:
日积月累,与君共进,增增小结,未完待续。