二叉搜索树中第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
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var kthSmallest = function(root, k) {
// 中序遍历(左根右)就是从小到大排序,排到第k个时停止
let res
function dfs(node) {
if(!k) return
if(!node) return
// 先深度遍历左节点
node.left && dfs(node.left)
// 然后根节点
k--
if(!k) { // 当k为0,已经轮到第k小的值了,返回输出结果
res = node.val
return
}
// 然后深度遍历右节点
node.right && dfs(node.right)
}
dfs(root)
return res
};
解题思路:
dfs大概思路都是差不多的,先一直往一个方向深入,然后知道碰到边界条件后,开始递归回去
拿示例2来说,把k改为k=4
:
- 1轮
dfs(root)
开始传入节点5
- 1轮走到
node.left && dfs(node.left)
,进入2轮dfs(节点3)
- 2轮走到
node.left && dfs(node.left)
,进入3轮dfs(节点2)
- 3轮走到
node.left && dfs(node.left)
,进入4轮dfs(节点1)
- 4轮走到
node.left && dfs(node.left)
,不符合,那就到根节点操作了,此时的值为最小值,k--
后k=3
。走到node.right && dfs(node.right)
,不符合,开始递归了,回到3轮dfs(节点2)
- 3轮到根节点操作了,此时的值为第2小值,
k--
后k=2
。走到node.right && dfs(node.right)
,不符合,回到2轮dfs(节点3)
- 2轮到根节点操作了,此时的值为第3小值,
k--
后k=1
。走到node.right && dfs(node.right)
,进入5轮dfs(4)
- 5轮走到
node.left && dfs(node.left)
,不符合。到根节点操作了,此时的值为第4小值k--
后k=0
,此时已经找到了第4小的值,所有递归都根据if(!k) return
结束
方法论
- 解题尽量自己想,短时间想不出就直接看题解照搬,太难就跳过。
- 不追求完美解题,能解就行。
- 每天有空就来上一题,没空就算了,拒绝内耗。