1. 二叉搜索树与中序遍历基础
二叉搜索树(BST)是一种特殊的二叉树数据结构,它具有以下关键性质:
- 对于任意节点,其左子树所有节点的值都小于该节点的值
- 对于任意节点,其右子树所有节点的值都大于该节点的值
- 左右子树也分别是二叉搜索树
这个性质决定了二叉搜索树的中序遍历(左-根-右)会产生一个升序排列的序列。这是解决本题的核心理论基础。
1.1 中序遍历的递归实现
传统的中序遍历递归实现通常如下:
cpp复制void inorder(TreeNode* root) {
if (!root) return;
inorder(root->left);
// 处理当前节点
cout << root->val << " ";
inorder(root->right);
}
这种实现会完整遍历整棵树,时间复杂度为O(n),空间复杂度为O(h),其中h是树的高度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 题目分析与解法优化
题目要求找出BST中第k小的元素。基于BST的性质,我们可以通过修改中序遍历来提前终止遍历,从而提高效率。
2.1 解法思路解析
给出的代码实现了一种优化的中序遍历方法:
- 先递归遍历左子树
- 处理当前节点时,计数器加1
- 当计数器等于k时,立即返回当前节点值
- 否则继续递归遍历右子树
这种实现有以下优点:
- 不需要存储整个中序遍历结果
- 找到第k小元素后立即终止后续遍历
- 空间复杂度仅为递归栈的O(h)
2.2 代码逐行解析
让我们详细分析给出的代码实现:
cpp复制class Solution {
public:
int record = 0; // 全局计数器,记录当前是第几个小元素
int kthSmallest(TreeNode* root, int k) {
int result = -1; // 初始化结果为-1(未找到)
// 递归遍历左子树
if (root->left)
result = kthSmallest(root->left, k);
// 如果左子树已找到结果,直接
