Advertisement
Guest User

Untitled

a guest
Oct 26th, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. void remove(BNo * raiz, Tipo elem, bool &status){
  2.     int i = 1,j;
  3.    // BNo * aux;
  4.     if (raiz == NULL){
  5.         cout << "Chave não encontrada\n";
  6.         status = false;
  7.         return;
  8.     }
  9.     while (i < raiz->qtd && elem > raiz->chv[i-1]) i++;
  10.     if (elem == raiz->chv[i-1]) {
  11.         //Testa se é nó folha
  12.         if (raiz->filhos[i] == NULL) {
  13.             raiz->qtd--;
  14.             status = (raiz->qtd < MIN_OCUP);
  15.             for (j=i; j <= raiz->qtd; j++) {
  16.                 raiz->chv[j-1] = raiz->chv[j];
  17.                 raiz->filhos[j] = raiz->filhos[j+1];
  18.             }
  19.             return;
  20.         }
  21.         //Não é folha, substitui pela chave imediatamente maior
  22.         raiz->chv[i-1] = raiz->filhos[i]->chv[0];
  23.         remove(raiz->filhos[i], raiz->chv[i-1], status);
  24.         if (status) {
  25.             // concatena ou redistribui
  26.             if (raiz->filhos[i-1]->qtd + raiz->filhos[i]->qtd >= MAX_CHAVES){
  27.                 insereArvoreB(raiz->filhos[i], raiz->chv[i]);
  28.                 raiz->chv[i] = raiz->filhos[i+1]->chv[0];
  29.                 removeArvoreB(raiz->filhos[i+1], raiz->chv[i]);
  30.                 status = false;
  31.             }
  32.             else {
  33.                 concatena(raiz->chv[i-1], raiz->filhos[i-1], raiz->filhos[i]);
  34.                 raiz->qtd--;
  35.                 for (j=i; j <= raiz->qtd; j++) {
  36.                     raiz->chv[j-1] = raiz->chv[j];
  37.                     raiz->filhos[j] = raiz->filhos[j+1];
  38.                 }
  39.                 status = (raiz->qtd < MIN_OCUP);
  40.             }
  41.         }
  42.         return;
  43.     }
  44.     if (elem > raiz->chv[i-1])
  45.         remove(raiz->filhos[i],elem, status);
  46.     else
  47.         remove(raiz->filhos[i-1], elem, status);
  48.     if (status) {
  49.         // concatena ou distribui
  50.         if (raiz->filhos[i]->qtd + raiz->filhos[i]->qtd >= MAX_CHAVES){
  51.             insereArvoreB(raiz->filhos[i], raiz->chv[i]);
  52.             raiz->chv[i] = raiz->filhos[i+1]->chv[0];
  53.             removeArvoreB(raiz->filhos[i+1], raiz->chv[i]);
  54.             status = false;
  55.         }
  56.         else {
  57.             concatena(raiz->chv[i-1],raiz->filhos[i-1], raiz->filhos[i] );
  58.             raiz->qtd--;
  59.             for (j=i; j < raiz->qtd; j++) {
  60.                 raiz->chv[j-1] = raiz->chv[j];
  61.                 raiz->filhos[j] = raiz->filhos[j+1];
  62.             }
  63.             status = (raiz->qtd < MIN_OCUP);
  64.         }
  65.     }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement