题目描述
给定一个二叉搜索树的根节点 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
解题思路1
- 直接递归遍历循环二叉树的全部节点,然后对全部节点做排序,返回第k-1个
代码1
var kthSmallest = function(){
let res = [];
res = pre(root, res);
return res.sort((a, b) => a -b)[k -1];
}
var dfs = function(root, res){
if(!root) return false;
res.push(root.val);
root.left && pre(root.left, res);
root.right && pre(root.right, res);
return res;
}
解题思路2
- 利用二叉搜索数的特性,左子节点小于父节点,右子节点大于父节点。
- 所以我们可以先遍历左节点并--k,当k减为0时,就返回当前节点的值。
- 如果左节点遍历完了后,k还要剩余就遍历右节点
var kthSmallest = function(){
let res;
var inOrderTraverseNode = function(root){
if(root != null && k > 0){
inOrderTraverseNode(root.left)
if(--k == 0){
return res = root.val;
}
inOrderTraverseNode(root.right);
}
}
inOrderTraverseNode(root);
return res;
}