Advertisement
Gilgamesh858

alberiEsempioVinc.cpp

Jun 12th, 2015
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.92 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. template <typename H> class Node{
  6.     private:
  7.         H key;
  8.         Node<H> *parent, *left, *right;
  9.     public:
  10.         Node(H key){
  11.         this->key = key;
  12.         parent = left = right = NULL;
  13.         }
  14.         H getKey(){ return key; }
  15.         Node<H>* getParent(){ return parent; }
  16.         Node<H>* getLeft(){ return left; }
  17.         Node<H>* getRight(){ return right; }
  18.         void setParent(Node<H>* parent){ this->parent = parent; }
  19.         void setLeft(Node<H>* left){ this->left = left; }
  20.         void setRight(Node<H>* right){ this->right = right; }
  21.         void setKey(H key) { this->key = key; }
  22.         bool isLeaf(){
  23.             if(left==NULL && right==NULL)
  24.                 return 1;
  25.             return 0;
  26.         }
  27. };
  28.  
  29. template <typename H> class Tree{
  30.     private:
  31.         Node<H>* root;
  32.     public:
  33.         Tree(){ root = NULL; }
  34.         Node<H>* getRoot() { return root; }
  35.         bool isEmpty(){
  36.             if(root==NULL)
  37.                 return 1;
  38.             return 0;
  39.         }
  40.         Tree<H>* ins(H x){
  41.             Node<H>* temp = new Node<H>(x);
  42.             if(root==NULL){
  43.                 root = temp;
  44.                 return this;
  45.             }
  46.  
  47.             Node<H>* t = root;
  48.             Node<H>* p = NULL;
  49.             while(t){
  50.                 p = t;
  51.                 if( t->getKey() > x ) t = t->getLeft();
  52.                 else t = t->getRight();
  53.             }
  54.             if( p->getKey() > x ){
  55.               p->setLeft(temp);
  56.               temp->setParent(p);
  57.               return this;
  58.             }
  59.             p->setRight(temp);
  60.             temp->setParent(p);
  61.             return this;
  62.         /*METODO NOSTRO
  63.             Node<H>* temp = new Node<H>(x);
  64.             if(isEmpty()){
  65.                 root = temp;
  66.                 return this;
  67.             }
  68.             Node<H>* n = root;
  69.             while(1){
  70.                 if(n->isLeaf()){
  71.                     if(temp->getKey() < n->getKey()){
  72.                         n->setLeft(temp);
  73.                         temp->setParent(n);
  74.                         return this;
  75.                     }
  76.                     n->setRight(temp);
  77.                     temp->setParent(n);
  78.                     return this;
  79.                 }
  80.                 if(temp->getKey() < n->getKey()){
  81.                     if(!n->getLeft()){
  82.                         n->setLeft(temp);
  83.                         temp->setParent(n);
  84.                         return this;
  85.                     }
  86.                     n = n->getLeft();
  87.                 }
  88.                 else{
  89.                     if(!n->getRight()){
  90.                         n->setRight(temp);
  91.                         temp->setParent(n);
  92.                         return this;
  93.                     }
  94.                     n = n->getRight();
  95.                 }
  96.             }*/
  97.         }
  98.         Node<H>* getNext(Node<H> *x){
  99.             if(getMax(root)->getKey() == x->getKey()) return NULL;
  100.             if(x->getRight()) return getMin(x->getRight());
  101.             while(x->getParent()->getKey() <= x->getKey()) x=x->getParent();
  102.             return x->getParent();
  103.         }
  104.         void del(H x){
  105.             if(!search(x)){
  106.                 cout << "Elemento inesistente" << endl;
  107.                 return;
  108.             }
  109.             Node<H> *temp = _search(x);
  110.             if(temp->isLeaf()){
  111.                 Node<H> *par = temp->getParent();
  112.                 if(!par){
  113.                     root = NULL;
  114.                     delete(temp);
  115.                     return;
  116.                 }
  117.                 if(par->getLeft() == temp){
  118.                     par->setLeft(NULL);
  119.                     delete(temp);
  120.                     return;
  121.                 }
  122.                 par->setRight(NULL);
  123.                 delete(temp);
  124.                 return;
  125.             }
  126.             if(!(temp->getLeft() && temp->getRight())){         //#1
  127.                 if(temp->getLeft()){                            //#2
  128.                     if(temp->getParent()->getLeft() == temp){   //#3
  129.                         temp->getParent()->setLeft(temp->getLeft());
  130.                         temp->getLeft()->setParent(temp->getParent());
  131.                         delete(temp);
  132.                         return;
  133.                     }                                           //!#3
  134.                     if(temp->getParent()->getRight() == temp){  //#3
  135.                         temp->getParent()->setRight(temp->getLeft());
  136.                         temp->getLeft()->setParent(temp->getParent());
  137.                         delete(temp);
  138.                         return;
  139.                     }                                           //!#3
  140.                 }                                               //!#2
  141.                 if(temp->getParent()->getLeft() == temp){       //#2
  142.                         temp->getParent()->setLeft(temp->getRight());
  143.                         temp->getRight()->setParent(temp->getParent());
  144.                         delete(temp);
  145.                         return;
  146.                 }                                               //!#2
  147.                 temp->getParent()->setRight(temp->getRight());
  148.                 temp->getRight()->setParent(temp->getParent());
  149.                 delete(temp);
  150.                 return;
  151.             }                                                   //!#1
  152.             Node<H> *sup = getNext(temp);
  153.             H p = sup->getKey();
  154.             sup->setKey(temp->getKey());
  155.             temp->setKey(p);
  156.             del(sup->getKey());
  157.             return;
  158.         }
  159.         int search(H x){
  160.             if(_search(x)) return 1;
  161.             return 0;
  162.         }
  163.         Node<H>* _search(H x){
  164.             if(isEmpty())
  165.                 return NULL;
  166.             Node<H> *temp = root;
  167.             while(temp!=NULL){
  168.                 if(temp->getKey() == x) return temp;
  169.                 if(temp->getKey()>x)
  170.                     temp = temp->getLeft();
  171.                 else temp = temp->getRight();
  172.             }
  173.             return NULL;
  174.         }
  175.         Node<H>* getMin(Node<H>* r){
  176.             if( r == NULL ) return NULL;
  177.             while(r->getLeft()) r = r->getLeft();
  178.             cout << r->getKey();
  179.             return r;
  180.         }
  181.         Node<H>* getMax(Node<H>* r){
  182.             if( r == NULL ) return NULL;
  183.             while(r->getRight()) r = r->getRight();
  184.             cout << r->getKey();
  185.             return r;
  186.         }
  187.         void rec_inorder(Node<H>* r){
  188.             if(!r) return;
  189.             rec_inorder(r->getLeft());
  190.             cout << r->getKey() << " ";
  191.             rec_inorder(r->getRight());
  192.         }
  193.         void rec_postorder(Node<H>* r){
  194.             if(!r) return;
  195.             rec_inorder(r->getLeft());
  196.             rec_inorder(r->getRight());
  197.             cout << r->getKey() << " ";
  198.         }
  199.         void rec_preorder(Node<H>* r){
  200.             if(!r) return;
  201.             cout << r->getKey() << " ";
  202.             rec_inorder(r->getLeft());
  203.             rec_inorder(r->getRight());
  204.         }
  205. };
  206.  
  207. int main(){
  208.     Tree<int> *T = new Tree<int>();
  209.     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);
  210.     T->rec_inorder(T->getRoot()); cout << endl ;
  211.     T->rec_postorder(T->getRoot()); cout << endl ;
  212.     T->rec_preorder(T->getRoot()); cout << endl ;
  213.     cout << endl << "Massimo " ;
  214.     T->getMax(T->getRoot());
  215.     cout << endl << "Minimo " ;
  216.     T->getMin(T->getRoot());
  217.     cout << endl ;
  218.     T->del(5);
  219.     T->rec_inorder(T->getRoot()); cout << endl ;
  220.     /*T->del(4);
  221.     T->rec_inorder(T->getRoot()); cout << endl ;
  222.     T->del(6);
  223.     T->rec_inorder(T->getRoot()); cout << endl ;
  224.     T->del(5);
  225.     T->rec_inorder(T->getRoot()); cout << endl ;
  226.     /*T->del(1);
  227.     T->rec_inorder(T->getRoot()); cout << endl ;
  228.     T->del(10);
  229.     T->rec_inorder(T->getRoot()); cout << endl ;
  230.     T->del(5);
  231.     T->rec_inorder(T->getRoot()); cout << endl ;*/
  232.  return 0;
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement