给定一个二叉搜索树(BST),找到树中第 K 小的节点

问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点。

出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家。

考察点:

 1. 基础数据结构的理解和编码能力

 2.  递归使用

参考答案:

1
2
3
4
5
6
7
       5
      / \
     3   6
    / \
   2   4
  /
 1

 

说明:保证输入的 K 满足 1<=K<=(节点数目)

树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
 * Definition for a binary tree node.
 **/
 
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}
 
class Solution {
    private class ResultType {
     
        boolean found;  // 是否找到
         
        int val;  // 节点数目
        ResultType(boolean found, int val) {
            this.found = found;
            this.val = val;
        }
    }
 
    public int kthSmallest(TreeNode root, int k) {
        return kthSmallestHelper(root, k).val;
    }
 
    private ResultType kthSmallestHelper(TreeNode root, int k) {
        if (root == null) {
            return new ResultType(false, 0);
        }
 
        ResultType left = kthSmallestHelper(root.left, k);
 
        // 左子树找到,直接返回
        if (left.found) {
            return new ResultType(true, left.val);
        }
 
        // 左子树的节点数目 = K-1,结果为 root 的值
        if (k - left.val == 1) {
            return new ResultType(true, root.val);
        }
 
        // 右子树寻找
        ResultType right = kthSmallestHelper(root.right, k - left.val - 1);
        if (right.found) {
            return new ResultType(true, right.val);
        }
 
        // 没找到,返回节点总数
        return new ResultType(false, left.val + 1 + right.val);
    }
}

 

历史题

如何实现一个高效的单向链表逆序输出?

求 sqrt (2)精确到小数点后 10 位

posted @   割肉机  阅读(432)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示