文章目录
二叉搜索树中第 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 = (root, k) => {
let count = 0; // 计数器
let result = null; // 存储结果
function inorderTraversal(root, k) {
if (root === null || count >= k) {
return; // 如果节点为空或已经找到第 k 小的元素
}
// 先遍历左子树
inorderTraversal(root.left, k);
// 访问当前节点
count++;
if (count === k) {
result = root.val; // 找到第 k 小的元素
return;
}
// 再遍历右子树
inorderTraversal(root.right, k);
}
count = 0; // 重置计数器
result = null; // 重置结果
inorderTraversal(root, k);
return result; // 返回第 k 小的元素
}
讲解
- inorderTraversal 函数:
- 进行中序遍历,参数为当前节点和 k 。
- 如果当前节点为空或已经找到第 k 小的元素,则返回。
- 先遍历左子树,然后访问当前节点并更新计数器。
- 如果计数器等于 k,则记录当前节点的值。
- 最后遍历右子树。
- kthSmallest 函数:
- 重置计数器和结果。
- 调用 inorderTraversal 进行遍历。
- 返回找到的第 k 小的元素。
网上思路
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 小的元素的值。
总结
递归我自己没写出来,还是看网上的教程写出来的。