Calculate rank with dfs as:
x < node.value: // do nothing x > node.value: + 1 + node.leftsize x = node.value: + node.leftsize
//example 43 21 61 10 30 50 70When x is not present, rank is still calculated properly.
i.e.
get-rank(5.5) = 5
get-rank(4.5) = 4
For duplicates, we break out on first occurrence.
node: value left right leftsize // size of left subtree (excluding this node) root = null process-stream(stream): foreach x in stream: insert(root, new node(x)): insert(node, x): if x == null: throw if node == null: root = x return if x <= node.value: node.leftsize++ if node.left != null: insert(node.left, x) else: node.left = x else: if node.right != null: insert(node.right, x) else: node.right = x get-rank(x): rank = 0 node = root while node != null: if x < node.value: // no change in rank node = node.left else if node.value < x: rank += 1 + node.leftsize node = node.right else: // x == node.value rank += node.leftsize break return rank
[Hat tip to ctci]
No comments:
Post a Comment