Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- template <class H> class MultiBST{
- public:
- virtual MultiBST<H>* ins(H x) = 0;
- virtual int search(H x) = 0;
- virtual void inorder() = 0;
- virtual MultiBST<H>* del(H x) = 0;
- };
- template <typename H> class Node{
- private:
- H key;
- int mul;
- Node<H> *parent, *left, *right;
- public:
- Node(H x){
- key = x;
- mul = 1;
- parent = left = right = NULL;
- }
- Node(const Node<H>& copy){
- key = copy.key;
- mul = copy.mul;
- parent = copy.parent;
- left = copy.left;
- right = copy.right;
- }
- H getKey() { return key; }
- int getMul() { return mul; }
- Node<H>* getParent() { return parent; }
- Node<H>* getLeft() { return left; }
- Node<H>* getRight() { return right; }
- void setKey(H x){ key = x; }
- void setParent(Node<H> *par){ parent = par; }
- void setLeft(Node<H> *lef){ left = lef; }
- void setRight(Node<H> *rig){ right = rig; }
- void setMul(int mul) { this->mul = mul; }
- void incMul(){ mul++; }
- void decMul(){ mul--; }
- int isLeaf() {
- if( left == NULL && right == NULL)
- return 1;
- return 0;
- }
- int onlyOneSon(){
- if(left!=NULL && right==NULL)
- return 1;
- else if(left==NULL && right!=NULL)
- return 2;
- return 0;
- }
- };
- template <typename H> class MyMultiBST: public MultiBST<H>{
- private:
- Node<H> *root;
- public:
- MyMultiBST(){ root = NULL; }
- int isEmpty(){
- if(root==NULL)
- return 1;
- return 0;
- }
- void _ins(Node<H> *aux, Node<H> *par, H x){
- if(aux!=NULL && aux->getKey() == x){
- aux->incMul();
- return;
- }
- if(aux==NULL){
- Node<H> *temp = new Node<H>(x);
- if(par==NULL){
- root = temp;
- //return;
- }
- if( x < par->getKey() ){
- par->setLeft(temp);
- temp->setParent(par);
- return;
- }
- else{
- par->setRight(temp);
- temp->setParent(par);
- return;
- }
- }
- par = aux;
- if( x < aux->getKey() )
- aux = aux->getLeft();
- else
- aux = aux->getRight();
- _ins(aux, par, x);
- }
- MultiBST<H>* ins(H x){
- _ins(root, NULL, x);
- return this;
- }
- int multiplicity(H x){
- if(search(x))
- return _search(root, x)->getMul();
- return 0;
- }
- void getMin(){
- if(isEmpty())
- return;
- cout << _getMin(root)->getKey() << endl;
- }
- Node<H> *_getMin(Node<H> *aux){
- if(aux->getLeft()==NULL)
- return aux;
- return _getMin(aux->getLeft());
- }
- Node<H> *getNext(Node<H> *aux){
- if(aux->getRight()!=NULL)
- return _getMin(aux->getRight());
- while(aux->getParent()->getKey() <= aux->getKey())
- aux = aux->getParent();
- return aux->getParent();
- }
- void _del(Node<H> *temp){
- if(temp->isLeaf()){
- if(temp==root){
- root=NULL;
- return;
- }
- if(temp->getParent()->getLeft()==temp){
- temp->getParent()->setLeft(NULL);
- delete(temp);
- return;
- }
- temp->getParent()->setRight(NULL);
- delete(temp);
- return;
- }
- if(temp->onlyOneSon()==1){
- if(temp==root){
- root = temp->getLeft();
- root->setParent(NULL);
- delete(temp);
- return;
- }
- temp->getParent()->setLeft(temp->getLeft());
- temp->getLeft()->setParent(temp->getParent());
- delete(temp);
- return;
- }
- if(temp->onlyOneSon()==2){
- if(temp==root){
- root = temp->getRight();
- root->setParent(NULL);
- delete(temp);
- return;
- }
- temp->getParent()->setRight(temp->getRight());
- temp->getRight()->setParent(temp->getParent());
- delete(temp);
- return;
- }
- Node<H> *next = getNext(temp);
- Node<H> dest = *temp;
- temp->setKey(next->getKey());
- temp->setMul(next->getMul());
- next->setKey(dest.getKey());
- next->setMul(dest.getMul());
- _del(next);
- }
- MultiBST<H>* del(H x){
- if(!search(x))
- return this;
- Node<H> *node = _search(root, x);
- if(node->getMul() > 1){
- node->decMul();
- return this;
- }
- _del(node);
- return this;
- }
- Node<H>* _search(Node<H> *aux, H x){
- if(aux==NULL)
- return NULL;
- if(aux->getKey() == x)
- return aux;
- if(aux->getKey() > x)
- return _search(aux->getLeft(), x);
- return _search(aux->getRight(), x);
- }
- int search(H x){
- if(_search(root, x) != NULL)
- return 1;
- return 0;
- }
- void _inorder(Node<H> *aux){
- if(aux==NULL)
- return;
- _inorder(aux->getLeft());
- for(int i=0; i < aux->getMul(); i++) cout << aux->getKey() << " ";
- _inorder(aux->getRight());
- }
- void _postorder(Node<H> *aux){
- if(aux==NULL)
- return;
- _postorder(aux->getLeft());
- _postorder(aux->getRight());
- for(int i=0; i < aux->getMul(); i++) cout << aux->getKey() << " ";
- }
- void _preorder(Node<H> *aux){
- if(aux==NULL)
- return;
- _preorder(aux->getLeft());
- _preorder(aux->getRight());
- for(int i=0; i < aux->getMul(); i++) cout << aux->getKey() << " ";
- }
- void inorder(){
- _inorder(root);
- cout << endl;
- }
- void postorder(){
- _postorder(root);
- cout << endl;
- }
- void preorder(){
- _preorder(root);
- cout << endl;
- }
- };
- int main()
- {
- MyMultiBST<int> *T = new MyMultiBST<int>();
- //T->ins(10)->ins(5)->ins(2)->ins(7)->ins(17)->ins(12)->ins(3)->ins(15);
- T->ins(10)->ins(7)->ins(7)->ins(23)->ins(30)->ins(4)->ins(1)->ins(5)->ins(9)->ins(5)->ins(1)->ins(7)->ins(1)->ins(9);
- T->inorder();
- T->getMin();
- T->del(7)->del(4)->del(23)->del(7);
- T->inorder();
- return 0;
- }
- #include <iostream>
- using namespace std;
- template <typename H> class Node{
- private:
- H key;
- Node<H> *parent, *left, *right;
- public:
- Node(H key){
- this->key = key;
- parent = left = right = NULL;
- }
- H getKey(){ return key; }
- Node<H>* getParent(){ return parent; }
- Node<H>* getLeft(){ return left; }
- Node<H>* getRight(){ return right; }
- void setParent(Node<H>* parent){ this->parent = parent; }
- void setLeft(Node<H>* left){ this->left = left; }
- void setRight(Node<H>* right){ this->right = right; }
- void setKey(H key) { this->key = key; }
- bool isLeaf(){
- if(left==NULL && right==NULL)
- return 1;
- return 0;
- }
- };
- template <typename H> class Tree{
- private:
- Node<H>* root;
- public:
- Tree(){ root = NULL; }
- Node<H>* getRoot() { return root; }
- bool isEmpty(){
- if(root==NULL)
- return 1;
- return 0;
- }
- Tree<H>* ins(H x){
- Node<H>* temp = new Node<H>(x);
- if(root==NULL){
- root = temp;
- return this;
- }
- Node<H>* t = root;
- Node<H>* p = NULL;
- while(t){
- p = t;
- if( t->getKey() > x ) t = t->getLeft();
- else t = t->getRight();
- }
- if( p->getKey() > x ){
- p->setLeft(temp);
- temp->setParent(p);
- return this;
- }
- p->setRight(temp);
- temp->setParent(p);
- return this;
- /*METODO NOSTRO
- Node<H>* temp = new Node<H>(x);
- if(isEmpty()){
- root = temp;
- return this;
- }
- Node<H>* n = root;
- while(1){
- if(n->isLeaf()){
- if(temp->getKey() < n->getKey()){
- n->setLeft(temp);
- temp->setParent(n);
- return this;
- }
- n->setRight(temp);
- temp->setParent(n);
- return this;
- }
- if(temp->getKey() < n->getKey()){
- if(!n->getLeft()){
- n->setLeft(temp);
- temp->setParent(n);
- return this;
- }
- n = n->getLeft();
- }
- else{
- if(!n->getRight()){
- n->setRight(temp);
- temp->setParent(n);
- return this;
- }
- n = n->getRight();
- }
- }*/
- }
- Node<H>* getNext(Node<H> *x){
- if(getMax(root)->getKey() == x->getKey()) return NULL;
- if(x->getRight()) return getMin(x->getRight());
- while(x->getParent()->getKey() <= x->getKey()) x=x->getParent();
- return x->getParent();
- }
- void del(H x){
- if(!search(x)){
- cout << "Elemento inesistente" << endl;
- return;
- }
- Node<H> *temp = _search(x);
- if(temp->isLeaf()){
- Node<H> *par = temp->getParent();
- if(!par){
- root = NULL;
- delete(temp);
- return;
- }
- if(par->getLeft() == temp){
- par->setLeft(NULL);
- delete(temp);
- return;
- }
- par->setRight(NULL);
- delete(temp);
- return;
- }
- if(!(temp->getLeft() && temp->getRight())){ //#1
- if(temp->getLeft()){ //#2
- if(temp->getParent()->getLeft() == temp){ //#3
- temp->getParent()->setLeft(temp->getLeft());
- temp->getLeft()->setParent(temp->getParent());
- delete(temp);
- return;
- } //!#3
- if(temp->getParent()->getRight() == temp){ //#3
- temp->getParent()->setRight(temp->getLeft());
- temp->getLeft()->setParent(temp->getParent());
- delete(temp);
- return;
- } //!#3
- } //!#2
- if(temp->getParent()->getLeft() == temp){ //#2
- temp->getParent()->setLeft(temp->getRight());
- temp->getRight()->setParent(temp->getParent());
- delete(temp);
- return;
- } //!#2
- temp->getParent()->setRight(temp->getRight());
- temp->getRight()->setParent(temp->getParent());
- delete(temp);
- return;
- } //!#1
- Node<H> *sup = getNext(temp);
- H p = sup->getKey();
- sup->setKey(temp->getKey());
- temp->setKey(p);
- del(sup->getKey());
- return;
- }
- int search(H x){
- if(_search(x)) return 1;
- return 0;
- }
- Node<H>* _search(H x){
- if(isEmpty())
- return NULL;
- Node<H> *temp = root;
- while(temp!=NULL){
- if(temp->getKey() == x) return temp;
- if(temp->getKey()>x)
- temp = temp->getLeft();
- else temp = temp->getRight();
- }
- return NULL;
- }
- Node<H>* getMin(Node<H>* r){
- if( r == NULL ) return NULL;
- while(r->getLeft()) r = r->getLeft();
- cout << r->getKey();
- return r;
- }
- Node<H>* getMax(Node<H>* r){
- if( r == NULL ) return NULL;
- while(r->getRight()) r = r->getRight();
- cout << r->getKey();
- return r;
- }
- void rec_inorder(Node<H>* r){
- if(!r) return;
- rec_inorder(r->getLeft());
- cout << r->getKey() << " ";
- rec_inorder(r->getRight());
- }
- void rec_postorder(Node<H>* r){
- if(!r) return;
- rec_inorder(r->getLeft());
- rec_inorder(r->getRight());
- cout << r->getKey() << " ";
- }
- void rec_preorder(Node<H>* r){
- if(!r) return;
- cout << r->getKey() << " ";
- rec_inorder(r->getLeft());
- rec_inorder(r->getRight());
- }
- };
- int main(){
- Tree<int> *T = new Tree<int>();
- T->ins(5)->ins(56)->ins(67);//->ins(2)->ins(20)->ins(1)->ins(4)->ins(6)->ins(7)->ins(8)->ins(9)->ins(10);
- T->rec_inorder(T->getRoot()); cout << endl ;
- T->rec_postorder(T->getRoot()); cout << endl ;
- T->rec_preorder(T->getRoot()); cout << endl ;
- cout << endl << "Massimo " ;
- T->getMax(T->getRoot());
- cout << endl << "Minimo " ;
- T->getMin(T->getRoot());
- cout << endl ;
- T->del(5);
- T->rec_inorder(T->getRoot()); cout << endl ;
- /*T->del(4);
- T->rec_inorder(T->getRoot()); cout << endl ;
- T->del(6);
- T->rec_inorder(T->getRoot()); cout << endl ;
- T->del(5);
- T->rec_inorder(T->getRoot()); cout << endl ;
- /*T->del(1);
- T->rec_inorder(T->getRoot()); cout << endl ;
- T->del(10);
- T->rec_inorder(T->getRoot()); cout << endl ;
- T->del(5);
- T->rec_inorder(T->getRoot()); cout << endl ;*/
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement