力扣HOT100之二叉树:230. 二叉搜索树中第 K 小的元素
这道题直接用最笨的办法来做的,用递归来做,我们定义一个全局变量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) {//中序遍历//遇到空节点返回0if(!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;}
};