这道题直接用最笨的办法来做的,用递归来做,我们定义一个全局变量vector<int> element
,然后使用中序遍历,每当碰到一个非空节点就将其加入到向量中,这样依赖当向量中的元素小于k
时,就返回0
,否则返回element[k - 1]
,下面是对应的代码。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> element{};
int kthSmallest(TreeNode* root, int k) {
//中序遍历
//遇到空节点返回0
if(!root) return 0;
//左
kthSmallest(root -> left, k);
//中
element.emplace_back(root -> val);
//右
kthSmallest(root -> right, k);
return element.size() >= k ? element[k - 1] : 0;
}
};
看了下灵神的题解,他也是用中序遍历来做的,但是没有使用额外的vector,因为vector插入元素也是耗时的,上面的代码可以进一步优化。
由于原函数已经规定了必须要有返回值,所以我们可以自己额外定义一个没有返回值的函数,这里我们可以用lambda函数来实现。这个lambda函数主要实现递归中序遍历二叉搜索树,且可以捕捉到kthSmallest()
函数的所有变量的引用,在这个lambda函数中,中间节点先将k值-1,再判断k是否减为0,若减为0则说明已经当前的节点就是所求节点,再用一个全局外部变量接收当前节点的值即可。在遍历结束后直接将这个全局外部变量返回即可。以下是优化过后的代码。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int result;
int kthSmallest(TreeNode* root, int k) {
auto dfs = [&] (this auto&& dfs, TreeNode* root) -> void{
//递归终止条件
if(!root || k == 0) return ;
//左
dfs(root -> left);
//中
k--;
if(k == 0) result = root -> val; //找到节点,记录答案
//右
dfs(root -> right);
};
dfs(root);
return result;
}
};