我试图实现一个E lower(E e)
方法到BST(二叉搜索树)数据结构。它应该是这样工作的——(返回集合中最大的元素,严格小于给定的元素,如果没有这样的元素,则返回null)。我被这个问题难住了。任何建议吗?
例如,如果我有一个二叉树:调用方法lower(6),应该返回5
5/
16
我的代码示例(Java)
public E lower(E e)
{
if (e== null) {
throw new IllegalArgumentException("Element is null in lower(E element)");
}
BstNode<E> node = root;
BstNode<E> parent = null;
BstNode<E> ch = null;
int cmp = c.compare(e, root.element);
while(node != null)
{
if (cmp > 0)
{
if(node.right != null)
{
node = node.right;
}
else
return node.element;
}
else
{
if(node.left != null)
{
node = node.left;
}
else
///DONT KNOW WHAT TO DO HERE
}
}
return null;
}
如果我理解正确的话,您需要找到小于输入的最大元素。
。如果你的树是:
5
/
3 8
/ /
2 4 6
7
您希望输入的lower(8)
返回7
。
可以通过顺序遍历来实现。这将允许您按照元素的排序顺序遍历二叉树。然后可以使用它来返回输入之前的元素。一种方法是将按顺序遍历存储在数组中,然后在输入位置之前打印元素1的索引。如果不存在这样的元素,这也允许您返回NULL。
您可以在这里找到将顺序遍历存储到数组中的实现。
您可以迭代BT并存储小于输入的最大的数字。您还可以通过不搜索根值大于您的值或小于当前最大值(小于输入值)的子树来提高效率。
算法:
- 让当前节点为根节点
- 重复:
- 如果当前节点大于或等于
e
并且有左子节点,则向左移动。 - 如果当前节点小于
e
并且有右子节点,则向右移动。 - 如果上面没有产生移动,那么停止循环
- 如果当前节点大于或等于
,
- 如果结果节点严格小于
e
,则它是想要的结果。否则, - 如果结果节点恰好是
e
,不是根节点,并且大于它的父节点,那么它的父节点就是想要的结果。否则 - 树中没有低于
e
的节点。