/****
BpmDj: Free Dj Tools
Copyright (C) 1995-2007 Werner Van Belle
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
****/
/*----------------------------------------------------------------------------
*
*
* AVLTREE 1.0
* (c) Werner Van Belle aug 95
*
*
* NODE_ADT AddAvlNode(NODE root, NODE who)
* Voegt who toe aan root, geeft als resultaat de nieuwe root weer
* O(log2n)
*
* NODE SearchAvlNode(NODE root, SEARCH_DATA watte)
* Zoekt watte op in root, geeft als resultaat de bijhorende node weer
* O(<log2n)
*
* NODE DeleteAvlNode(NODE root, SEARCH_DATA wie)
* Verwijdert wie uit root, geeft als resultaat de nieuwe root weer
* O(log2n)
*
* int ValidAvlTree(Node* root)
* Controleert of de AVL-tree wel aan de AVL-voorwaarde voldoet. Hier
* wordt niet gecontroleerd of de linkerkinderen kleiner zijn dan root
* en de rechterkinderen groter zijn dan root
* O(n)
*
* int AvlTreeCount(Node* root)
* geeft weer hoeveel elementen in de tree steken.
* O(n)
*
* int depth()
* geeft de maximum diepte van een pad doorheen de tree weer.
* O(n)
*
* void PrintAvlTree(Node* root, int diepte)
* Print de avltree. Deze functie is enkel aanwezig als PRINT_NODE
* gedefinieerd is. Het output formaat is
* .rechterkind
* rootzelf
* .linkerkind
*/
#ifndef AVLTREE_H
#define AVLTREE_H
#include <assert.h>
template <class Key> class Sentinel;
template <class Key> class Node
{
public:
static Sentinel<Key> * Null;
Node<Key> * left;
Node<Key> * right;
int flag;
Node<Key>();
virtual ~Node<Key>() {};
virtual int compareAddData(Node<Key>* w2) = 0; // compares this with w2
virtual int compareSearchData(Key key) = 0; // compares this with key
virtual void print() {assert(0);};
virtual void print(int prefix);
virtual int depth();
virtual int count();
virtual bool valid();
virtual Node<Key>* search(Key);
virtual bool isNull() {return false;};
virtual Node<Key>* RotateLeft(int& depthchanged);
virtual Node<Key>* RotateRight(int& depthchanged);
virtual Node<Key>* LeftFreedom(Node<Key>* &placetostorefreedom, int& heightchanged);
virtual Node<Key>* RightFreedom(Node<Key>* &placetostorefreedom, int& heightchanged);
virtual Node<Key>* GetLeftFreedom(Node<Key>* &placetostorefreedom, int& heightchanged);
virtual Node<Key>* GetRightFreedom(Node<Key>* &placetostorefreedom, int& heightchanged);
virtual Node<Key>* AddAvlNode(Node<Key>* who, int& depthchanged);
virtual Node<Key>* DeleteAvlNode(Key wie, int& heightchanged);
Node<Key>* toAnswer() {return isNull() ? NULL : this;};
};
template <class Key> class AvlTree
{
private:
Node<Key>* root;
Node<Key>* AddAvlNode(Node<Key>* root, Node<Key>* who);
Node<Key>* DeleteAvlNode(Node<Key>* root, Key wie);
void PurgeAll(Node<Key>* root);
public:
AvlTree();
void init();
virtual ~AvlTree();
void add(Node<Key>* who) { root = AddAvlNode(root,who); };
Node<Key>* search(Key watte) { return root->search(watte)->toAnswer();};
void del(Key watte) { root = DeleteAvlNode(root,watte); };
bool valid() { return root->valid(); };
int count() { return root->count(); };
int depth() { return root->depth(); };
void print() { root->print(0); };
void purge() { PurgeAll(root); root = NULL; };
Node<Key> *top() { return root->toAnswer(); };
};
#endif