Leetcode二叉搜索树中第K小的元素

110 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

给定一个二叉搜索树的根节点 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

二、解题思路

二叉搜索树是这样一种结构:对于任意一个节点,左子树的值全都比该节点小,右子树的值全都比该节点大。一开始对于这道题,脑子里走了些弯路,由于从根节点算起,无法直接知道左子树和右子树有多少节点,想到层序遍历、深度优先搜索等,但是无法想到合理的遍历策略。瞄了眼评论区,看到四个字:《中序遍历》。可不是嘛,对于二叉搜索树,中序遍历一遍就会得到一个递增列表,然后在直接取第k个就行。AC代码如下,可以进行的小优化是在遍历的时候统计一下当前列表的长度,然后再第k个提前停止,嫌麻烦并未加在代码中。

三、AC代码

var kthSmallest = function(root, k) {
    let tree = [];
    let find = function(node){
        if(node.left) find(node.left);
        tree.push(node.val);
        if(node.right) find(node.right);
    }
    find(root);
    return tree[k-1];
};

四、总结

没有第一时间找到思路说明虽然了解中序遍历,但是还是没有融会贯通。另外另一种二叉树:堆,对于第k大/第k小问题其实是最合适的数据结构。