Advertisement
Riposati

Arvore

Apr 15th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct arvore{
  6.  
  7.     int chave;
  8.     struct arvore *dir;
  9.     struct arvore *esq;
  10.  
  11. }typedef Arvore;
  12.  
  13. Arvore *insere(Arvore *raiz,int chave){
  14.  
  15.     if(raiz==NULL){
  16.  
  17.         Arvore *aux = new(Arvore);
  18.         aux->dir = NULL;
  19.         aux->esq = NULL;
  20.         aux->chave = chave;
  21.  
  22.         raiz = aux;
  23.  
  24.     }else{
  25.  
  26.         if(raiz->chave > chave){
  27.  
  28.             raiz->esq = insere(raiz->esq,chave);
  29.  
  30.         }else if(raiz->chave < chave){
  31.  
  32.             raiz->dir = insere(raiz->dir,chave);
  33.         }
  34.     }
  35.  
  36.     return raiz;
  37. }
  38.  
  39. void infixa(Arvore *raiz){
  40.  
  41.     if(raiz!=NULL){
  42.  
  43.         infixa(raiz->esq);
  44.         cout<<raiz->chave<<" ";
  45.         infixa(raiz->dir);
  46.     }
  47. }
  48.  
  49. Arvore *deleta(Arvore *raiz, int chave){
  50.  
  51.     if(raiz==NULL) // condição de parada da recursão
  52.         return raiz;
  53.  
  54.     // ------------- procurar a chave -------------
  55.  
  56.     if(raiz->chave > chave){
  57.  
  58.         raiz->esq = deleta(raiz->esq,chave);
  59.  
  60.     }else if(raiz->chave < chave){
  61.  
  62.         raiz->dir = deleta(raiz->dir,chave);
  63.  
  64.     // ---------------------------------------------
  65.  
  66.     }else if(raiz->esq==NULL && raiz->dir==NULL){ // folha
  67.  
  68.         free(raiz);
  69.         raiz = NULL;
  70.  
  71.    }else if(raiz->esq != NULL && raiz->dir == NULL){ // filho unico esq
  72.  
  73.         Arvore *t = raiz;
  74.         raiz = raiz->esq;
  75.         free(t);
  76.  
  77.    }else if(raiz->esq == NULL && raiz->dir != NULL){ // filho único dir
  78.  
  79.         Arvore *t = raiz;
  80.         raiz = raiz->dir;
  81.         free(t);
  82.  
  83.    }else if(raiz->esq != NULL && raiz->dir != NULL){ // dois filhos
  84.  
  85.         Arvore *sucessorImediato = raiz->dir;
  86.  
  87.         while(sucessorImediato->esq != NULL){
  88.  
  89.             sucessorImediato = sucessorImediato->esq;
  90.         }
  91.  
  92.         raiz->chave = sucessorImediato->chave;
  93.         sucessorImediato->chave = chave;
  94.  
  95.         raiz->dir = deleta(sucessorImediato,chave);
  96.    }
  97.    return raiz;
  98. }
  99.  
  100. int main()
  101. {
  102.     ios_base::sync_with_stdio(false);
  103.     cin.tie(0);
  104.  
  105.     Arvore *raiz = NULL;
  106.  
  107.     raiz = insere(raiz,20);
  108.     raiz = insere(raiz,10);
  109.     raiz = insere(raiz,30);
  110.     raiz = insere(raiz,5);
  111.     raiz = insere(raiz,13);
  112.     raiz = insere(raiz,2);
  113.     raiz = insere(raiz,7);
  114.     raiz = insere(raiz,12);
  115.     raiz = insere(raiz,40);
  116.     raiz = insere(raiz,32);
  117.     raiz = insere(raiz,48);
  118.     raiz = insere(raiz,35);
  119.  
  120.     infixa(raiz);
  121.  
  122.     raiz = deleta(raiz,30);
  123.     raiz = deleta(raiz,5);
  124.     raiz = deleta(raiz,13);
  125.     raiz = deleta(raiz,2);
  126.     raiz = deleta(raiz,7);
  127.     raiz = deleta(raiz,40);
  128.     raiz = deleta(raiz,20);
  129.  
  130.     cout<<"\n";
  131.  
  132.     infixa(raiz);
  133.  
  134.     return 0;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement