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);
    }
}
相关推荐
罗西的思考13 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer13 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
文丑颜不良啊14 小时前
LeetCode51~75题目解析
leetcode
高晶14 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
ysbfsy14 小时前
大数计算思路
算法
高晶14 小时前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
学电子她就能回来吗15 小时前
LeetCode Hot 100|普通数组专题学习笔记(零基础版)
笔记·算法·leetcode
用户老李15 小时前
反向传播计算梯度举例
算法
niyongsheng15 小时前
多智能体连续时间内路径规划:AA-SIPP(m) 的 Rust 实现与算法
算法·rust·机器人
招聘背调实务专家杨宏15 小时前
上级评价出现主观偏差与口径冲突时如何校准
职场和发展