力扣 Hot 100 刷题记录 - 二叉搜索树中第 K 小的元素
力扣 Hot 100 刷题记录 - 二叉搜索树中第 K 小的元素
题目描述
二叉搜索树中第 K 小的元素 是力扣 Hot 100 中的一道经典题目,题目要求如下:
给定一个二叉搜索树(BST)的根节点 root
和一个整数 k
,请你设计一个算法找到其中第 k
小的元素。
示例 1:
输入:root = [3,1,4,null,2], k = 1
输出:1
示例 2:
输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3
解题思路
二叉搜索树(BST)的性质是 中序遍历结果为升序序列。因此,可以通过中序遍历找到第 k
小的元素。
方法一:递归中序遍历
- 对 BST 进行中序遍历,记录遍历结果。
- 返回第
k
个元素。
方法二:迭代中序遍历
- 使用栈模拟中序遍历,避免递归调用栈的开销。
- 在遍历过程中直接找到第
k
小的元素。
C++ 代码实现
方法一:递归中序遍历
/**
* 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 kthSmallest(TreeNode* root, int k) {
vector<int> inorder_result;
inorder(root, inorder_result); // 中序遍历
return inorder_result[k - 1]; // 返回第 k 小的元素
}
private:
void inorder(TreeNode* root, vector<int>& result) {
if (!root) return; // 递归终止条件
inorder(root->left, result); // 遍历左子树
result.push_back(root->val); // 访问根节点
inorder(root->right, result); // 遍历右子树
}
};
方法一:递归中序遍历
#include <stack>
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
stack<TreeNode*> stk;
TreeNode* curr = root;
while (curr || !stk.empty()) {
// 遍历左子树
while (curr) {
stk.push(curr);
curr = curr->left;
}
// 访问根节点
curr = stk.top();
stk.pop();
if (--k == 0) return curr->val; // 找到第 k 小的元素
// 遍历右子树
curr = curr->right;
}
return -1; // 未找到(正常情况下不会执行到这里)
}
};