我该怎么做?我不确定何时会停止搜索。
答案 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)