2010-06-27 35 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)