Leetcode 二叉搜索树的第 K 个元素

复习一下二叉搜索树
二叉搜索树 (Binary Search Tree, 简称 BST) 是一种特殊的二叉树(可以为空),其中每个节点都有一个值,并且满足以下特点:

定义:

  1. 左子树节点的值小于根节点的值:对于每个节点,左子树中所有节点的值都小于该节点的值。
  2. 右子树节点的值大于根节点的值:对于每个节点,右子树中所有节点的值都大于该节点的值。
  3. 左右子树本身也是二叉搜索树:即递归地应用上述规则,左子树和右子树也必须是二叉搜索树。

特点:

  1. 查找效率高 :在理想情况下(树的高度接近平衡时,即左右子树高度接近),二叉搜索树的查找、插入、删除操作的时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn),其中 n n n 是树中的节点数。
  2. 有序性:二叉搜索树的中序遍历会按升序输出节点的值,因此可以用来进行排序或快速查找最大、最小值。
  3. 插入和删除:插入新节点和删除节点时,需要遵循二叉搜索树的规则,确保树的有序性。
  4. 平衡性问题 :在极端情况下(如连续插入升序或降序的值),二叉搜索树可能会退化为一条链表,此时树的高度为 O ( n ) O(n) O(n),查找、插入和删除的时间复杂度将退化为 O ( n ) O(n) O(n)。
  5. 空间复杂度 :使用指针结构,空间复杂度通常为 O ( n ) O(n) O(n),其中 n n n 是节点数。

注意 :为了避免二叉搜索树退化为链表,一些平衡二叉搜索树如红黑树 (Red-Black Tree) 或 AVL 树等会动态保持树的平衡性,确保操作的时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)。

算法思想:

  1. 二叉搜索树的性质 :二叉搜索树(BST)有一个重要性质:左子树的所有节点值都小于根节点,右子树的所有节点值都大于根节点。因此,对二叉搜索树进行中序遍历 (先左子树 -> 根节点 -> 右子树),会按升序依次访问每个节点的值。

  2. 中序遍历的过程可以确保我们从最小的节点开始访问,并依次访问较大的节点。因此,当我们访问到第 k 个节点时,该节点即为树中第 k 小的元素。

java solution

java 复制代码
class Solution {
    private int count = 0;
    private int result = 0;
    public int kthSmallest(TreeNode root, int k) {
        inorderTraversal(root, k);
        return result;
    }
    private void inorderTraversal(TreeNode root, int k) {
        if(root == null) {
            return;
        }
        // 递归遍历左子树
        inorderTraversal(root.left, k);

        // 访问当前节点
        count++;
        if(count == k) {
            result = root.val;
            return; //找到结果后可以直接返回
        }

        // 递归遍历右子树
        inorderTraversal(root.right, k);
    }
}
相关推荐
TL滕1 分钟前
从0开始学算法——第十二天(KMP算法练习)
笔记·学习·算法
Math_teacher_fan5 分钟前
第二篇:核心几何工具类详解
人工智能·算法
汉克老师6 分钟前
CCF-NOI2025第二试题目与解析(第二题、集合(set))
c++·算法·noi·子集卷积·sos dp·mod 异常
mit6.82433 分钟前
presum|
算法
不穿格子的程序员34 分钟前
从零开始写算法——链表篇2:从“回文”到“环形”——链表双指针技巧的深度解析
数据结构·算法·链表·回文链表·环形链表
guygg881 小时前
基于Matlab的压缩感知信道估计算法实现
开发语言·算法·matlab
诺....1 小时前
C语言不确定循环会影响输入输出缓冲区的刷新
c语言·数据结构·算法
Yuroo zhou1 小时前
采矿定向技术演进:MEMS定向短节的崛起
算法·硬件架构·硬件工程·石油·钻井