在BST中查找小于x的所有数字

时间:2010-06-27 07:33:11

标签: algorithm

我该怎么做?我不确定何时会停止搜索。

3 个答案:

答案 0 :(得分:2)

如果树的每个节点都有一个字段numLeft,告诉你左边子树中有多少个节点(也自己计算),那么你可以在O(log N)

中执行此操作

只需将numLeft添加到值小于x的每个节点的全局结果变量中:

countLessThan(int x, node T)
    if T = null
        return
    if T.value >= x
        countLessThan(x, T.left) // T.left contains only numbers < T.value and T.right only numbers > T.value
    else
        globalResult += T.numLeft
        countLessThan(x, T.right)

这只会计算数字。如果要打印它们,则需要编写深度优先遍历,以打印作为参数给出的子树。你可以在网上找到很多,所以我不会发布。

答案 1 :(得分:0)

不确定这是否正是您正在寻找的,但二元搜索树算法是经典的,而互联网则充满了它们。 http://www.algolist.net/Data_structures/Binary_search_tree/Lookup - 至少应该让你朝着正确的方向前进(你会想要修改'找到'条件并返回'集合'而不是bool)。

答案 2 :(得分:0)

如果您需要编号列表,无论如何都需要遍历树。对于BST,您可以从最低到最高进行遍历 但是如果你需要代表最低数字的子树:

def splitLowerTree(x, node):
  if node is None: return None
  elif node.value == x: return node.left
  elif node.value < x:
      if node.right is None: return node
      else: return Node(node.value, left = node.left, right = splitLowerTree(x, node.right))
  else: return splitLowerTree(x, node.left)