文章目录
二叉搜索树中第 K 小的元素
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。
图一:
图二:
示例 1:
输入:root = [3,1,4,null,2], k = 1
输出:1
示例 2:
输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3
我的思路
递归
网上思路
栈
我的思路
var kthSmallest = function(root, k) {
let count = 0;
let result = null;
function inOrder(node) {
if (node === null) return;
inOrder(node.left);
count++;
if (count === k) {
result = node.val;
return; // 一旦找到,停止遍历
}
inOrder(node.right);
}
inOrder(root);
return result;
};
讲解
在二叉搜索树(BST)中,中序遍历(左-根-右的顺序)将产生一个有序的序列。因此,要找到第 k 小的元素,我们可以对 BST 进行中序遍历,同时使用一个计数器来跟踪我们已经访问了多少个节点。当计数器的值等于 k 时,我们正在访问的节点就是第 k 小的元素。
- 初始化计数器:创建一个变量 count 初始化为 0 ,用于记录已访问的节点数量。
- 定义中序遍历函数:定义一个递归函数 inOrder(node) ,它接收一个节点作为参数。在函数中,先递归地遍历左子树,然后访问当前节点(计数器加 1 ,检查是否等于 k ),最后递归地遍历右子树。
- 访问当前节点:在访问当前节点时,增加 count 的值。如果 count 等于 k,那么当前节点就是第 k 小的元素,返回该节点的值。
- 调用中序遍历函数:在主函数中,调用 inOrder(root) 函数开始遍历。
- 返回结果:返回找到的第 k 小的元素的值。
网上思路
var kthSmallest = (root, k) => {
const stack = [];
let current = root;
let count = 0;
while (current !== null || stack.length > 0) {
// 将所有左子节点压入栈中
while (current !== null) {
stack.push(current);
current = current.left;
}
// 弹出栈顶元素
current = stack.pop();
count++;
// 如果计数等于 k,返回当前节点的值
if (count === k) {
return current.val;
}
// 继续遍历右子树
current = current.right;
}
return null; // 如果没有找到,返回 null
}
讲解
kthSmallest 函数:
- 初始化一个空栈 stack 和一个指针 current 指向根节点。
- 使用 while 循环进行遍历,条件是当前节点不为空或栈不为空。
- 内部的 while 循环将所有左子节点压入栈中。
- 弹出栈顶元素,更新计数器 count。
- 如果 count 等于 k,返回当前节点的值。
- 否则,继续遍历当前节点的右子树。
总结
没啥好总结的,因为递归yyds