[路飞]_230. 二叉搜索树中第K小的元素

61 阅读1分钟

题目路径

题目描述

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例 1:

image.png

输入: root = [3,1,4,null,2], k = 1
输出: 1

示例 2:

image.png

输入: 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;
}