给定一棵二叉搜索树,请找出其中的第k小的结点。
你可以假设树和k都存在,并且1≤k≤树的总结点数。
样例
输入:root = [2, 1, 3, null, null, null, null] ,k = 3
2
/ \
1 3
输出:3
思路就是中序遍历,但是这道题写的时候,却踩了坑。。。。
本来在这个地方我是这样写的:
if (node.size() == kk - 1){
res = root;
return;
}
node.push_back(root -> val);
dfs(root -> right,node);
这样的写法有的一个坑就是: 当第一次node中的结点个数为kk - 1 的时候,还没来得及插入当前值就return了,这样回到上一次还是node.size() == kk - 1 会再更新一次res,导致出错了。
class Solution {
public:
vector<int>node;
TreeNode* res;
int kk;
bool flag = true;
void dfs(TreeNode* root,vector<int>& node){
if (!root) return;
dfs(root -> left,node);
node.push_back(root -> val);
if (node.size() == kk){
res = root;
return;
}
dfs(root -> right,node);
}
TreeNode* kthNode(TreeNode* root, int k) {
kk = k;
dfs(root,node);
return res;
}
};