#include <iostream>
template <typename T>
class Splay_Tree
{
public:
Splay_Tree();
bool find(const T& val);
void insert(const T& val);
void del(const T& val);
private:
typedef struct tagNODE
{
T data;
struct tagNODE *left, *right;
tagNODE(const T& val, tagNODE* cl, tagNODE* cr)
{
data = val;
left = cl;
right = cr;
}
}NODE;
NODE *tree_root;
NODE* own_find(NODE* tree, const T& val);
NODE* rolatewithleft(NODE* tree);
NODE* rolatewithright(NODE* tree);
};
template <typename T> Splay_Tree<T>::Splay_Tree()
{
tree_root = NULL;
}
template <typename T> typename Splay_Tree<T>::NODE* Splay_Tree<T>::rolatewithleft(NODE* tree)
{
NODE *p = tree->left;
tree->left = p->right;
p->right = tree;
return p;
}
template <typename T> typename Splay_Tree<T>::NODE* Splay_Tree<T>::rolatewithright(NODE* tree)
{
NODE *p = tree->right;
tree->right = p->left;
p->left = tree;
return p;
}
template <typename T> typename Splay_Tree<T>::NODE* Splay_Tree<T>::own_find(NODE* tree, const T& val)
{
if (NULL == tree)
return tree;
else if (tree->data > val)
{
tree->left = own_find(tree->left, val);
if (tree->left && tree->left->data == val)
tree = rolatewithleft(tree);
}
else if (tree->data < val)
{
tree->right = own_find(tree->right, val);
if (tree->right && tree->right->data == val)
tree = rolatewithright(tree);
}
return tree;
}
template <typename T> bool Splay_Tree<T>::find(const T& val)
{
NODE *p = own_find(tree_root, val);
if (NULL != p)
tree_root = p;
return p != NULL;
}
template <typename T> void Splay_Tree<T>::insert(const T& val)
{
NODE *p = tree_root, *pr = NULL;
NODE *pn = new NODE(val, NULL, NULL);
while (p && p->data != val)
{
pr = p;
if (val > p->data)
p = p->right;
else if (val < p->data)
p = p->left;
}
if (NULL == tree_root)
tree_root = pn;
else if (NULL == p)
{
if (pr->data > val)
pr->left = pn;
else
pr->right = pn;
}
}
template <typename T> void Splay_Tree<T>::del(const T& val)
{
if (NULL != own_find(tree_root, val))
{
NODE *pl = tree_root->left;
NODE *pr = tree_root->right;
delete tree_root;
if (NULL != pl && NULL != pr)
{
pl->right = pr->left;
pr->left = pl;
tree_root = pr;
}
else if (NULL == pl || NULL == pr)
tree_root = (NULL == pl) ? pr : pl;
else
tree_root = NULL;
}
}