题目描述
知识点
BTS的特殊性质、中序遍历
结果
空间复杂度不太满意。。。
实现
码前思考
- 这是一道典型的结合BTS的性质来考察二叉树中序遍历的题目,我觉得难度就是模板题难度;
- 为了防止多余的递归,我设置一个
bool
变量标记是否已经找到;
代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
//题目中有个follow up指优化
//优化我知道该怎么写,我只会中序遍历惹
class Solution {
private:
// int number;
// int value;
// //设置一个值表示是否找到
// bool found;
public:
void inOrder(TreeNode* root,int k,int& number,bool& found,int& value){
if(root == NULL){
return;
}else if(!found){
inOrder(root->left,k,number,found,value);
if(number == k){
value = root->val;
found = true;
number++;
return;
}else{
number++;
}
inOrder(root->right,k,number,found,value);
}
}
int kthSmallest(TreeNode* root, int k) {
int number = 1;
bool found = false;
int value;
//进行中序遍历找到第n个
inOrder(root,k,number,found,value);
return value;
}
};
码后反思
- 看讨论有人说用局部变量会速度快些,于是我改成了局部变量,结果然并卵,还多了0.1M空间:
难道是我的打开方式有问题? - 看网友题解,发现可以自己手工模拟一个栈来实现功能,这样就可以避免不必要的递归了。。。因为我们的递归本来就是栈呀~这样时间缩小了一般,很好了: