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

二叉树

# 题目描述

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

示例 1:

img

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

示例 2:

img

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

# 外地解法-二叉搜索的特性(中序遍历)

首先,明确BST的特性:

  1. 对于 BST 的每一个节点 node,左子树节点的值都比 node 的值要小,右子树节点的值都比 node 的值大。
  2. 对于 BST 的每一个节点 node,它的左侧子树和右侧子树都是 BST。

从做算法题的角度来看 BST,除了它的定义,还有一个重要的性质:BST 的中序遍历结果是有序的(升序)

也就是说,如果输入一棵 BST,以下代码可以将 BST 中每个节点的值升序打印出来:

void traverse(TreeNode root) {
    if (root == null) return;
    traverse(root.left);
    // 中序遍历代码位置
    print(root.val);
    traverse(root.right);
}
1
2
3
4
5
6
7

一个直接的思路就是升序排序,然后找第 k 个元素呗。BST 的中序遍历其实就是升序排序的结果,找第 k 个元素肯定不是什么难事。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int kthSmallest(TreeNode root, int k) {
        // 特性:BST中序遍历结果是有序的
        traverse(root, k);
        return ans;
    }

    int rank = 0;
    int ans = 0;

    public void traverse(TreeNode root, int k){
        if(root == null) return;

        traverse(root.left, k);
        /**中序遍历*/
        rank++;
        if(rank == k){
            ans = root.val;
            return;
        }
        traverse(root.right, 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
Last Updated: 11/22/2022, 10:02:55 PM