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);
    }
}
相关推荐
luckys.one1 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|2 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师2 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo32 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
好家伙VCC3 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
liulilittle5 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
bkspiderx6 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
中华小当家呐8 小时前
算法之常见八大排序
数据结构·算法·排序算法
沐怡旸8 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试