#include "bst.h" template typename BST::node *BST::insert(BST::node *n, const int &key, const T *content, bool &success) { if (n == NULL) { n = new BST::node; n->key = key; n->content = content; n->l = NULL; n->r = NULL; n->p = NULL; } else if (key == n->key) { success = false; return n; } else if (key > n->key) { n->r = insert(n->r, key, content); n->r->p = n; } else { n->l = insert(n->l, key, content); n->l->p = n; } return n; } template bool BST::insert(const int &key, const T *content) { bool success = true; root = insert(root, key, content, success); return success; } template typename BST::node *BST::search(const BST::node *n, const int &key) { if (n == NULL) return NULL; else if (n->key == key) { return n; } else if (key > n->key) { return search(n->r, key); } else { return search(n->l, key); } } template T *BST::search(const int &key) { node *n = search(root, key); if (n == NULL) return NULL; return n->content; } template typename BST::node *BST::min(BST::node *n) { if (n == NULL) { return NULL; } else if (n->l == NULL) { return n; } else return min(n->l); } template typename BST::node *BST::max(BST::node *n) { if (n == NULL) { return NULL; } else if (n->r == NULL) { return n; } else return min(n->r); } template T *BST::min() { node *n = min(root); if (n == NULL) { return NULL; } return n->content; } template T *BST::max() { node *n = max(root); if (n == NULL) { return NULL; } return n->content; } template typename BST::node *BST::succ(BST::node *n) { if (n->r != NULL) { return min(n->r); } else { node *parent = n->p; node *current = n; while (parent != NULL and current == parent->r) { current = parent; parent = current->p; } return parent; } } template T *BST::succ(const int &key) { node *n = search(root, key); return n == NULL ? NULL : succ(n); } template typename BST::node *BST::pred(BST::node *n) { if (n->l != NULL) { return max(n->l); } else { node *parent = n->p; node *current = n; while (parent != NULL and current == parent->l) { current = parent; parent = current->p; } return parent; } } template T *BST::pred(const int &key) { node *n = search(root, key); return n == NULL ? NULL : pred(n); }