如何实现二叉搜索树(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; }
核心逻辑说明
- 候选变量跟踪:用
candidate记录所有小于e的节点中最大的那个。每当遇到当前节点元素小于e时,先将其设为候选,再往右子树探索(BST右子树元素更大,可能存在更优的候选) - 动态比较:每次遍历新节点时重新计算
cmp,确保比较的是当前节点与目标元素的关系 - 分支处理:
- 若当前节点小于
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
相关产品推荐
相关产品推荐

