Java二叉搜索树知识点(含面试大厂题和源码)

二叉搜索树(Binary Search Tree,简称BST)是一种特殊的二叉树,它支持许多动态集合操作,如查找、插入、删除、最大值、最小值等。在二叉搜索树中,每个节点包含一个键(以及可能伴随的附加信息),并满足以下性质:

  1. 节点的左子树只包含键小于节点键的树。
  2. 节点的右子树只包含键大于节点键的树。
  3. 左右子树也必须分别为二叉搜索树。
  4. 没有键值相等的节点(假设所有的键都是唯一的)。

二叉搜索树的操作

  • 查找(Search):从根节点开始,与当前节点比较,若小于当前节点,则向左子树查找;若大于,则向右子树查找;相等则找到了目标节点。如果查找失败,则意味着树中不存在该键值。

  • 插入(Insert):插入操作类似于查找操作。从

根节点开始,根据插入的键值与当前节点的比较结果决定是向左子树走还是向右子树走,直到到达一个叶节点后的空位置,然后在那里创建新的节点。这样保证了树的二叉搜索属性不被破坏。

  • 删除(Delete):删除操作比较复杂,主要有三种情况:

    1. 删除的节点是叶节点:直接删除,不会影响其他节点。
    2. 删除的节点只有一个子节点:删除该节点,并用其子节点替代它的位置。
    3. 删除的节点有两个子节点:找到该节点的后继节点(右子树中的最小节点)或前驱节点(左子树中的最大节点),用它来替换被删除节点的位置,然后删除原后继节点或前驱节点的位置。
  • 最小值和最大值(Min/Max):在二叉搜索树中查找最小值和最大值相对简单。最小值总是在树的最左边的节点中找到,最大值总是在树的最右边的节点中找到。

  • 中序遍历(Inorder Traversal):中序遍历二叉搜索树可以得到一个键的有序序列。遍历的顺序是先遍历左子树,然后访问根节点,最后遍历右子树。

二叉搜索树的性能

二叉搜索树操作的性能依赖于树的高度。在最好的情况下(树是完全平衡的),操作的时间复杂度为O(log n),其中n是树中节点的数目。在最坏的情况下(树完全不平衡,形成了一个链),操作的时间复杂度退化为O(n)。

为了解决这个问题,出现了多种类型的平衡二叉搜索树,如AVL树、红黑树等,它们通过在树中进行旋转等操作来保持树的平衡,以此来保证操作的高效性。

掌握二叉搜索树的基本概念和操作对于理解更复杂的数据结构和算法至关重要。它不仅是许多高级数据结构的基础,而且也是面试中常见的考察点。在面试大厂时,考察二叉搜索树相关的问题是非常常见的。以下是三个涉及二叉搜索树的面试题,包括问题描述和Java实现代码。

题目1:验证二叉搜索树

问题描述 :给定一个二叉树的根节点 root,判断其是否是一个有效的二叉搜索树。一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数,节点的右子树只包含大于当前节点的数,且左右子树也必须是二叉搜索树。

Java实现:

java 复制代码
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Solution {
    private TreeNode prev = null;

    public boolean isValidBST(TreeNode root) {
        return inorder(root);
    }

    private boolean inorder(TreeNode node) {
        if (node == null) return true;
        if (!inorder(node.left)) return false;
        if (prev != null && node.val <= prev.val) return false;
        prev = node;
        return inorder(node.right);
    }
}

题目2:二叉搜索树中第K小的元素

问题描述 :给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 小的元素。

Java实现:

java 复制代码
public 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 node, int k) {
        if (node == null) return;
        inorderTraversal(node.left, k);
        count++;
        if (count == k) {
            result = node.val;
            return;
        }
        inorderTraversal(node.right, k);
    }
}

题目3:将有序数组转换为二叉搜索树

问题描述 :给你一个整数数组 nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡的二叉搜索树。高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。

Java实现:

java 复制代码
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        if (nums == null || nums.length == 0) return null;
        return constructBSTRecursive(nums, 0, nums.length - 1);
    }

    private TreeNode constructBSTRecursive(int[] nums, int left, int right) {
        if (left > right) return null;
        int mid = left + (right - left) / 2;
        TreeNode node = new TreeNode(nums[mid]);
        node.left = constructBSTRecursive(nums, left, mid - 1);
        node.right = constructBSTRecursive(nums, mid + 1, right);
        return node;
    }
}

这些题目不仅检验你对二叉搜索树概念的理解,还考察你解决问题的能力和代码实现的能力。在面试中能够熟练地解答出类似题目,通常会给面试官留下较好的印象。不过,记住理解题目背后的逻辑和原理是最重要的,代码只是实现思路的一种表达方式。

相关推荐
文丑颜不良啊1 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang2 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪2 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息3 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼3 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff4 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff5 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
武子康5 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
AiMan5 小时前
别再把秘塔会话逐个点开:这可把秘塔多个会话一次导出?AI导出鸭
前端·后端·面试