
Untitled
By: a guest on
Jun 26th, 2012 | syntax:
C++ | size: 3.19 KB | hits: 15 | expires: Never
#ifndef PERSISTENTBSTREE_H
#define PERSISTENTBSTREE_H
#include <vector>
#define ptr std::shared_ptr<Node>
#define newptr std::make_shared<Node>()
struct Node {
ptr left;
ptr right;
int value;
Node() {
left = NULL;
right = NULL;
}
};
struct BSTree {
ptr root;
BSTree() {
root = NULL;
}
BSTree(ptr newroot) {
root = newroot;
}
bool find(int x) {
ptr t = root;
while (t != NULL) {
if (t->value == x) {
return true;
}
if (t->value < x) {
t = t->right;
}
else if (t->value > x) {
t = t->left;
}
}
return false;
}
BSTree copy(BSTree bst) {
ptr t = bst.root;
return BSTree(t);
}
BSTree insert(int x) {
if (find(x)) {
return BSTree(root);
}
ptr t = root;
ptr newt = newptr;
ptr newroot = newt;
while (t != NULL) {
if (t->value < x) {
newt->value = t->value;
newt->left = t->left;
newt->right = newptr;
newt = newt->right;
t = t->right;
}
else if (t->value > x) {
newt->value = t->value;
newt->right = t->right;
newt->left = newptr;
newt = newt->left;
t = t->left;
}
}
newt->value = x;
BSTree bst(newroot);
return bst;
}
BSTree remove(int x) {
if (!find(x)) {
return BSTree(root);
}
ptr t = root;
ptr newt = newptr;
ptr prevt;
ptr newroot = newt;
//finding t, where t->value = x;
while (t->value != x) {
if (t->value < x) {
newt->value = t->value;
newt->left = t->left;
newt->right = newptr;
prevt = newt;
newt = newt->right;
t = t->right;
}
else if (t->value > x) {
newt->value = t->value;
newt->right = t->right;
newt->left = newptr;
prevt = newt;
newt = newt->left;
t = t->left;
}
}
//if t have no children
if (t->left == NULL && t->right == NULL) {
if (prevt->right == newt) {
prevt->right = NULL;
}
else if (prevt->left == newt) {
prevt->left = NULL;
}
return BSTree(newroot);
}
//if t have one children
if (t->left != NULL && t->right == NULL) {
if (prevt->right == newt) {
prevt->right = t->left;
}
else if (prevt->left == newt) {
prevt->left = t->left;
}
return BSTree(newroot);
}
if (t->right != NULL && t->left == NULL) {
if (prevt->right == newt) {
prevt->right = t->right;
}
else if (prevt->left == newt) {
prevt->left = t->right;
}
return BSTree(newroot);
}
//if t have two children
ptr mint = newptr;
newt->right = mint;
newt->left = t->left;
t = t->right;
while (t->left != NULL) {
mint->value = t->value;
mint->right = t->right;
mint->left = newptr;
prevt = mint;
mint = mint->left;
t = t->left;
}
newt->value = t->value;
prevt->left = NULL;
return BSTree(newroot);
}
};
struct PersistentBSTree {
std::vector<BSTree> trees;
PersistentBSTree() {
BSTree t;
trees.push_back(t);
}
bool find(int x, int version) {
return trees[version].find(x);
}
void insert(int x, int version) {
trees.push_back(trees[version].insert(x));
}
void remove(int x, int version) {
trees.push_back(trees[version].remove(x));
}
};
#endif