#include <iostream>
struct BST {
struct Node {
Node *left;
Node *right;
Node *parent;
int count;
int value;
};
Node *root;
BST() : root(0) {
}
void add(Node *parent, int value) {
if (parent) {
Node *node = new Node();
node->value = value;
node->left = 0;
node->right = 0;
node->parent = parent;
node->count = 1;
if (parent->left)
parent->right = node;
else
parent->left = node;
while (parent) {
parent->count++;
parent = parent->parent;
}
} else {
root = new Node;
root->count = 1;
root->parent = 0;
root->left = 0;
root->right = 0;
root->value = value;
}
}
int countLessThan(const Node *n, int value) const {
if (n->value >= value) {
// The value has to be in the left sub-tree, so continue searching there:
if (n->left)
return countLessThan(n->left, value);
else
return 0;
} else {
// The value has to be in the right sub-tree, so continue searching there
// but include the whole left sub-tree and myself:
int count = 1;
if (n->left)
count += n->left->count;
if (n->right)
count += countLessThan(n->right, value);
return count;
}
}
int countLessThan(int value) {
return countLessThan(root, value);
}
};
int main() {
// Create the BST as in the example:
BST *t = new BST;
t->add(NULL, 8);
t->add(t->root, 3);
t->add(t->root->left, 1);
t->add(t->root->left, 6);
t->add(t->root, 14);
t->add(t->root->right, 10);
// Show some example outputs
for(int i = 0; i < 20; ++i) {
printf("countLessThan(%d) = %d\n", i, t->countLessThan(i));
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEJTVCB7CiAgICBzdHJ1Y3QgTm9kZSB7CiAgICAgICAgTm9kZSAqbGVmdDsKICAgICAgICBOb2RlICpyaWdodDsKICAgICAgICBOb2RlICpwYXJlbnQ7CiAgICAgICAgaW50IGNvdW50OwogICAgICAgIGludCB2YWx1ZTsKICAgIH07CiAgICBOb2RlICpyb290OwogICAgQlNUKCkgOiByb290KDApIHsKICAgIH0KICAgIHZvaWQgYWRkKE5vZGUgKnBhcmVudCwgaW50IHZhbHVlKSB7CiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgICBOb2RlICpub2RlID0gbmV3IE5vZGUoKTsKICAgICAgICAgICAgbm9kZS0+dmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgbm9kZS0+bGVmdCA9IDA7CiAgICAgICAgICAgIG5vZGUtPnJpZ2h0ID0gMDsKICAgICAgICAgICAgbm9kZS0+cGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICBub2RlLT5jb3VudCA9IDE7CiAgICAgICAgICAgIGlmIChwYXJlbnQtPmxlZnQpCiAgICAgICAgICAgICAgICBwYXJlbnQtPnJpZ2h0ID0gbm9kZTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcGFyZW50LT5sZWZ0ID0gbm9kZTsKICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkgewogICAgICAgICAgICAgICAgcGFyZW50LT5jb3VudCsrOwogICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LT5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByb290ID0gbmV3IE5vZGU7CiAgICAgICAgICAgIHJvb3QtPmNvdW50ID0gMTsKICAgICAgICAgICAgcm9vdC0+cGFyZW50ID0gMDsKICAgICAgICAgICAgcm9vdC0+bGVmdCA9IDA7CiAgICAgICAgICAgIHJvb3QtPnJpZ2h0ID0gMDsKICAgICAgICAgICAgcm9vdC0+dmFsdWUgPSB2YWx1ZTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGludCBjb3VudExlc3NUaGFuKGNvbnN0IE5vZGUgKm4sIGludCB2YWx1ZSkgY29uc3QgewogICAgICAgIGlmIChuLT52YWx1ZSA+PSB2YWx1ZSkgewogICAgICAgICAgICAvLyBUaGUgdmFsdWUgaGFzIHRvIGJlIGluIHRoZSBsZWZ0IHN1Yi10cmVlLCBzbyBjb250aW51ZSBzZWFyY2hpbmcgdGhlcmU6CiAgICAgICAgICAgIGlmIChuLT5sZWZ0KQogICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50TGVzc1RoYW4obi0+bGVmdCwgdmFsdWUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBUaGUgdmFsdWUgaGFzIHRvIGJlIGluIHRoZSByaWdodCBzdWItdHJlZSwgc28gY29udGludWUgc2VhcmNoaW5nIHRoZXJlCiAgICAgICAgICAgIC8vIGJ1dCBpbmNsdWRlIHRoZSB3aG9sZSBsZWZ0IHN1Yi10cmVlIGFuZCBteXNlbGY6CiAgICAgICAgICAgIGludCBjb3VudCA9IDE7CiAgICAgICAgICAgIGlmIChuLT5sZWZ0KQogICAgICAgICAgICAgICAgY291bnQgKz0gbi0+bGVmdC0+Y291bnQ7CiAgICAgICAgICAgIGlmIChuLT5yaWdodCkKICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50TGVzc1RoYW4obi0+cmlnaHQsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgIH0KICAgIH0KICAgIGludCBjb3VudExlc3NUaGFuKGludCB2YWx1ZSkgewogICAgICAgIHJldHVybiBjb3VudExlc3NUaGFuKHJvb3QsIHZhbHVlKTsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgLy8gQ3JlYXRlIHRoZSBCU1QgYXMgaW4gdGhlIGV4YW1wbGU6CiAgICBCU1QgKnQgPSBuZXcgQlNUOwogICAgdC0+YWRkKE5VTEwsIDgpOwogICAgdC0+YWRkKHQtPnJvb3QsIDMpOwogICAgdC0+YWRkKHQtPnJvb3QtPmxlZnQsIDEpOwogICAgdC0+YWRkKHQtPnJvb3QtPmxlZnQsIDYpOwogICAgdC0+YWRkKHQtPnJvb3QsIDE0KTsKICAgIHQtPmFkZCh0LT5yb290LT5yaWdodCwgMTApOwogICAgCiAgICAvLyBTaG93IHNvbWUgZXhhbXBsZSBvdXRwdXRzCiAgICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkgewogICAgICAgIHByaW50ZigiY291bnRMZXNzVGhhbiglZCkgPSAlZFxuIiwgaSwgdC0+Y291bnRMZXNzVGhhbihpKSk7CiAgICB9Cn0=