二叉搜索树满足“左子树 < 当前节点 < 右子树”。因此中序遍历得到的访问顺序就是升序,第 k 次访问的节点正是答案。
function kthSmallest(root, k) {
let visited = 0;
let answer;
function inorder(node) {
if (!node || answer !== undefined) return;
inorder(node.left);
if (++visited === k) {
answer = node.val;
return;
}
inorder(node.right);
}
inorder(root);
return answer;
}
原始实现用 result !== null 提前结束递归,思路是正确的。修正版改用 undefined 区分“尚未找到”,避免节点值本身可能为 null 时产生歧义。
最坏情况下仍需访问 O(n) 个节点,递归栈为 O(h);如果树高可能很大,可以改用显式栈迭代。若树支持频繁查询,则可以在节点上维护子树大小,把单次查询进一步降到与树高相关。