Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int _nivel = 0;
- int _quantidade = 0;
- bool _removeu = false;
- bool _achou = false;
- //BST ~DIMASDARK ~ ADAPTADO PRA QUESTAO DE ALGORITMOS
- //PS: ODEIO ESSAS COISAS DE NÃO DEIXAR ESPAÇO NO FINAL, PFVR NÉ -.-"
- typedef struct arvore
- {
- int tipo;
- int quantidade;
- struct arvore* esquerda;
- struct arvore* direita;
- } Arv;
- Arv* inicializar()
- {
- return NULL;
- }
- Arv* inserir(int t, int qtd, Arv* raiz, int &nivel, int &qimp, int n = 0)
- {
- //qimp = quantidade a imprimir
- //n = nível a imprimir
- nivel = n;
- if (raiz == NULL)
- {
- Arv* no = new Arv();
- no->tipo = t;
- no->quantidade = qtd;
- no->direita = no->esquerda = NULL;
- raiz = no;
- qimp = qtd;
- return raiz;
- }
- else
- {
- if (t < raiz->tipo )
- {
- raiz->esquerda = inserir(t, qtd, raiz->esquerda, nivel, qimp, n+1);
- }
- else if (t > raiz->tipo)
- {
- raiz->direita = inserir(t, qtd, raiz->direita, nivel, qimp, n+1);
- }
- else
- {
- raiz->quantidade = raiz->quantidade + qtd;
- qimp = raiz->quantidade;
- }
- return raiz;
- }
- }
- int busca (Arv* arv, int t)
- {
- int i = arv->quantidade;
- if (arv == NULL)
- return 0; /* árvore vazia: não encontrou */
- else
- {
- if (t > arv->tipo)
- {
- busca(arv->direita, t);
- }
- else if (t < arv->tipo)
- {
- busca(arv->esquerda,t);
- }
- else
- {
- return i;
- }
- }
- return 0;
- }
- Arv* buscaNo(Arv* arv, int t, int &nivel, int &qtd,int n = 0)
- {
- nivel = n;
- Arv* aux = arv;
- if (arv == NULL)
- return NULL; /* árvore vazia: não encontrou */
- else
- {
- if (t > arv->tipo)
- {
- aux = buscaNo(arv->direita, t, nivel, qtd, n+1);
- }
- else if (t < arv->tipo)
- {
- aux = buscaNo(arv->esquerda,t, nivel, qtd, n+1);
- }
- else
- {
- qtd = aux->quantidade;
- }
- return aux;
- }
- }
- void preOrdem(Arv* arv, bool cabeca = true)
- {
- if (arv != NULL)
- {
- if (cabeca)
- printf("%d", arv->tipo);
- else
- printf(" %d", arv->tipo);
- preOrdem(arv->esquerda, false);
- preOrdem(arv->direita, false);
- }
- }
- void posOrdem(Arv* arv, bool cabeca = true)
- {
- if (arv != NULL)
- {
- posOrdem(arv->esquerda, false);
- posOrdem(arv->direita, false);
- if (cabeca)
- printf("%d", arv->tipo);
- else
- printf("%d ", arv->tipo);
- }
- }
- void emOrdem(Arv* arv, Arv* maior, bool cabeca = false)
- {
- if (arv != NULL)
- {
- emOrdem(arv->esquerda, maior, false);
- if (arv->tipo == maior->tipo)
- printf("%d", arv->tipo);
- else
- printf("%d ", arv->tipo);
- emOrdem(arv->direita, maior, true);
- }
- }
- //Para a sub a direita
- Arv* pegaAntesMenor(Arv* arvdir)
- {
- while (arvdir->esquerda != NULL)
- {
- if (arvdir->esquerda->esquerda == NULL)
- break;
- else
- arvdir = arvdir ->esquerda;
- }
- return arvdir;
- }
- Arv* pegaMenorDireita(Arv* arvdir)
- {
- while (arvdir->esquerda != NULL)
- {
- arvdir = arvdir ->esquerda;
- }
- return arvdir;
- }
- //Para maior no da sub a esquerda
- Arv* pegaAntesMaior(Arv* arvesq)
- {
- if (arvesq->direita != NULL)
- {
- if (arvesq->direita->direita == NULL)
- return arvesq;
- else
- pegaAntesMenor(arvesq->direita);
- }
- else
- return arvesq;
- return 0;
- }
- Arv* pegaMaiorElemento(Arv* arv)
- {
- if (arv != NULL)
- {
- while (arv->direita != NULL)
- arv = arv->direita;
- }
- return arv;
- }
- Arv* removerMinimoDireita(Arv* arvdir)
- {
- Arv* aux = new Arv();
- if (arvdir -> esquerda == NULL)
- {
- aux = arvdir -> direita;
- delete(arvdir);
- return aux;
- }
- else
- {
- arvdir -> esquerda = removerMinimoDireita(arvdir -> esquerda);
- return arvdir;
- }
- }
- Arv* removerMaximoEsquerda(Arv* arvesq)
- {
- Arv* aux = new Arv();
- if (arvesq -> direita == NULL)
- {
- aux = arvesq -> esquerda;
- delete(arvesq);
- return aux;
- }
- else
- {
- arvesq -> direita = removerMinimoDireita(arvesq -> direita);
- return arvesq;
- }
- }
- void deletarArvore(Arv* arvore)
- {
- if ( arvore != NULL )
- {
- deletarArvore( arvore->esquerda );
- deletarArvore( arvore->direita );
- delete(arvore);
- }
- }
- Arv* deletar2(Arv* arv, int t, int qtd, int &nivel, int &quantidade, bool &removeu, int n = 0)
- {
- nivel = n;
- Arv* temp;
- if(arv==NULL)
- {
- }
- else if(t < arv->tipo)
- {
- arv->esquerda = deletar2(arv->esquerda, t, qtd, nivel, quantidade, removeu, n+1);
- }
- else if(t > arv->tipo)
- {
- arv->direita = deletar2(arv->direita, t, qtd, nivel, quantidade, removeu, n+1);
- }
- else
- {
- if(arv->direita && arv->esquerda)
- {
- if (qtd >= arv->quantidade)
- {
- /* Pega o menor el. da sub arvore a direita e substitui */
- temp = pegaMenorDireita(arv->direita);
- arv -> tipo = temp->tipo;
- arv -> quantidade = temp->quantidade;
- /* Deletar o no que substituiu pra nao ficar repetido */
- arv -> direita = removerMinimoDireita(arv->direita);
- removeu = true;
- }
- else
- {
- arv->quantidade -= qtd;
- quantidade = arv->quantidade;
- }
- }
- else
- {
- /* Se tiver zero ou 1 filhos */
- if (qtd >= arv->quantidade)
- {
- temp = arv;
- if(arv->esquerda == NULL)
- arv = arv->direita;
- else if(arv->direita == NULL)
- arv = arv->esquerda;
- delete(temp);
- removeu = true;
- }
- else
- {
- arv->quantidade -= qtd;
- quantidade = arv->quantidade;
- }
- }
- }
- return arv;
- }
- //void teste()
- //{
- //
- // Arv* teste = inicializar();
- // teste = inserir (2, 20, teste, _nivel, _quantidade, _soma);
- // teste = inserir(5, 20, teste, _nivel, _quantidade, _soma);
- // teste = inserir(7, 10, teste, _nivel, _quantidade, _soma);
- // teste = inserir(6, 50, teste, _nivel, _quantidade, _soma);
- // teste = inserir (9, 20, teste, _nivel, _quantidade, _soma);
- // teste = inserir (4, 50, teste, _nivel, _quantidade, _soma);
- // teste = inserir (11, 0, teste, _nivel, _quantidade, _soma);
- // teste = inserir (10, 0, teste, _nivel, _quantidade, _soma);
- // teste = inserir (12, 5, teste, _nivel, _quantidade, _soma);
- // teste = inserir (8, 44, teste, _nivel, _quantidade, _soma);
- //
- // remover(7, 20, teste);
- // // remover(teste, 10, 0);
- //// remover(teste, 11, 0);
- //// remover(teste, 7, 0);
- //// remover(teste, 6, 0);
- //
- //
- //
- //
- // printf("Pre Ordem:\n");
- // preOrdem(teste);
- // printf("\nPos Ordem:\n");
- // posOrdem(teste);
- // printf("\nEm Ordem:\n");
- // emOrdem(teste);
- //
- //}
- int main()
- {
- freopen("L2Q1.in", "r", stdin);
- freopen("L2Q1.out", "w", stdout);
- // teste();
- int comando = 0, tipo = 0, quantidade = 0;
- int operacoes;
- while (scanf("%d", &operacoes) != EOF)
- {
- // printf("Operacoes: %d\n", operacoes);
- getchar();
- Arv* arvore = new Arv();
- arvore = inicializar();
- while (operacoes > 0)
- {
- char linha [30];
- fgets(linha, 30, stdin);
- int num = sscanf(linha, "%d %d %d", &comando, &tipo, &quantidade);
- // if (comando == 1)
- // printf("Numero da operacao: %d. Tipo: %d. Quantidade: %d\n", operacoes, tipo, quantidade);
- // else if (comando == 2)
- // printf("Numero da operacao: %d. Tipo: %d. Quantidade: %d\n", operacoes, tipo, quantidade);
- // else if (comando == 3)
- // printf("Numero da operacao: %d. Tipo: %d.\n", operacoes, tipo);
- // else
- // printf("Numero da operacao: %d. Tipo: %d.\n", operacoes, tipo);
- //3 ints lidos, comando 1 e 2
- if (num == 3)
- {
- if (comando == 1)
- {
- arvore = inserir(tipo, quantidade, arvore, _nivel, _quantidade);
- printf("%d %d\n", _nivel, _quantidade);
- _nivel = 0;
- _quantidade = 0;
- }
- else if (comando == 2)
- {
- arvore = deletar2(arvore, tipo, quantidade, _nivel, _quantidade, _removeu);
- if (!_removeu)
- {
- if (_quantidade != 0) //Se removeu quantidade
- {
- printf("%d %d\n", _nivel, _quantidade);
- }
- else
- {
- //Imprime nada
- }
- }
- else
- {
- printf("%d\n", _nivel);
- _removeu = false;
- }
- _nivel = 0;
- _quantidade = 0;
- }
- }
- else if (num == 2) //2 ints lidos ~comando 3
- {
- if (buscaNo(arvore, tipo, _nivel, _quantidade)) //Se encontrou
- {
- printf("%d %d\n", _nivel,_quantidade);
- }
- else
- {
- //Imprime nada
- }
- _nivel = 0;
- _quantidade = 0;
- }
- else //num = 1
- {
- if (comando == 4)
- {
- Arv* maior = pegaMaiorElemento(arvore);
- emOrdem(arvore, maior);
- if (arvore != NULL)
- printf("\n");
- }
- else if (comando == 5)
- {
- posOrdem(arvore);
- if (arvore != NULL)
- printf("\n");
- }
- else if (comando == 6)
- {
- preOrdem(arvore);
- if (arvore != NULL)
- printf("\n");
- }
- }
- operacoes--;
- }
- printf("\n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement