You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现二叉搜索树(BST)的lower()方法?求技术指导

二叉搜索树lower方法实现修正方案

要实现的lower(E e)方法需要返回集合中严格小于给定元素的最大元素,无符合条件元素时返回null。原代码存在几个关键逻辑缺陷,导致无法正确完成需求:

  • 比较值cmp仅在方法开头初始化一次,未在遍历每个节点时重新计算,无法准确判断当前节点与目标元素的大小关系
  • 没有维护候选变量跟踪当前找到的符合条件的最大元素,盲目返回节点值的逻辑不严谨
  • 当当前节点大于等于目标元素且左子树为空时,缺少正确的回溯逻辑

修正后的代码

public E lower(E e) {
    if (e == null) {
        throw new IllegalArgumentException("Element is null in lower(E element)");
    }
    BstNode<E> node = root;
    BstNode<E> candidate = null; // 记录当前找到的最大小于e的元素

    while (node != null) {
        int cmp = c.compare(e, node.element); // 每次遍历都重新计算比较结果
        if (cmp > 0) {
            // 当前节点元素小于e,更新候选后往右找更大的符合条件元素
            candidate = node;
            node = node.right;
        } else {
            // 当前节点元素大于等于e,往左找更小的元素
            node = node.left;
        }
    }
    return candidate != null ? candidate.element : null;
}

核心逻辑说明

  1. 候选变量跟踪:用candidate记录所有小于e的节点中最大的那个。每当遇到当前节点元素小于e时,先将其设为候选,再往右子树探索(BST右子树元素更大,可能存在更优的候选)
  2. 动态比较:每次遍历新节点时重新计算cmp,确保比较的是当前节点与目标元素的关系
  3. 分支处理:
    • 若当前节点小于e:更新候选后向右探索更大的符合条件元素
    • 若当前节点大于等于e:直接向左探索更小的元素,右子树元素必然更大,无需考虑

示例验证

以题目中的二叉树结构为例:

5
   / \
  1   6

调用lower(6)时:

  • 初始节点为5,cmp=compare(6,5)=1>0,candidate设为5,节点移至右子树6
  • 节点为6时,cmp=compare(6,6)=0,节点移至左子树(null)
  • 循环结束,返回candidate的元素5,符合预期

内容的提问来源于stack exchange,提问作者Lukas Jankauskas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:25:39