2010-06-27 37 views

回答

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) 

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

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)