复习一下二叉搜索树
二叉搜索树 (Binary Search Tree, 简称 BST) 是一种特殊的二叉树(可以为空),其中每个节点都有一个值,并且满足以下特点:
定义:
- 左子树节点的值小于根节点的值:对于每个节点,左子树中所有节点的值都小于该节点的值。
- 右子树节点的值大于根节点的值:对于每个节点,右子树中所有节点的值都大于该节点的值。
- 左右子树本身也是二叉搜索树:即递归地应用上述规则,左子树和右子树也必须是二叉搜索树。
特点:
- 查找效率高 :在理想情况下(树的高度接近平衡时,即左右子树高度接近),二叉搜索树的查找、插入、删除操作的时间复杂度为 O ( log n ) O(\log n) O(logn),其中 n n n 是树中的节点数。
- 有序性:二叉搜索树的中序遍历会按升序输出节点的值,因此可以用来进行排序或快速查找最大、最小值。
- 插入和删除:插入新节点和删除节点时,需要遵循二叉搜索树的规则,确保树的有序性。
- 平衡性问题 :在极端情况下(如连续插入升序或降序的值),二叉搜索树可能会退化为一条链表,此时树的高度为 O ( n ) O(n) O(n),查找、插入和删除的时间复杂度将退化为 O ( n ) O(n) O(n)。
- 空间复杂度 :使用指针结构,空间复杂度通常为 O ( n ) O(n) O(n),其中 n n n 是节点数。
注意 :为了避免二叉搜索树退化为链表,一些平衡二叉搜索树如红黑树 (Red-Black Tree) 或 AVL 树等会动态保持树的平衡性,确保操作的时间复杂度为 O ( log n ) O(\log n) O(logn)。
算法思想:
-
二叉搜索树的性质 :二叉搜索树(BST)有一个重要性质:左子树的所有节点值都小于根节点,右子树的所有节点值都大于根节点。因此,对二叉搜索树进行中序遍历 (先左子树 -> 根节点 -> 右子树),会按升序依次访问每个节点的值。
-
中序遍历的过程可以确保我们从最小的节点开始访问,并依次访问较大的节点。因此,当我们访问到第 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);
}
}