惠州网站建设方案托管重庆网站优化
力扣 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; // 未找到(正常情况下不会执行到这里)}
};