Dúvidas sobre rotação de árvores e (seta) -> [RESOLVIDO]

1. Dúvidas sobre rotação de árvores e (seta) -> [RESOLVIDO]

Filipe Braz
FilipeBraz

(usa Arch Linux)

Enviado em 07/06/2017 - 12:42h

Boa tarde Pessoal,
o código a seguir é um código incompleto, porém tenho muita dúvida em relação às setas e como proceder com o balanceamento da árvore. Na teoria entendo muito bem, mas para a implantação já me complico.

#include <stdio.h>
#include <iostream>
#include <string>
#include <conio.h>
#include <stdlib.h>
#include <locale.h>

//Definimos o registro que representará cada elemento da árvore avl

struct ARVORE{
int num, altd, alte;
ARVORE *dir, *esq;
};

ARVORE* rotacao_esquerda(ARVORE* aux){
ARVORE *aux1, *aux2;
aux1 = aux->dir;
aux2 = aux1->esq;
aux->dir = aux2;
aux1->esq = aux;
if(aux->dir == NULL){
aux->altd=0;
}else if (aux->dir->alte > aux->dir->altd){
aux->altd = aux->dir->alte+1;
} else{
aux->altd = aux->dir->altd+1;
}

if(aux1->esq->alte > aux1->esq->altd){
aux1->alte = aux1->esq->alte+1;
} else{
aux1->alte = aux1->esq->altd+1;
}
return aux1;
}

ARVORE* rotacao_direita(ARVORE* aux){
ARVORE *aux1, *aux2;
aux1 = aux->esq;
aux2 = aux1->dir;
aux->esq = aux2;
aux1->dir = aux;
if(aux->esq == NULL){
aux->alte=0;
}else if (aux->esq->alte > aux->esq->altd){
aux->alte = aux->esq->alte+1;
} else{
aux->alte = aux->esq->altd+1;
}

if(aux1->dir->alte > aux1->dir->altd){
aux1->altd = aux1->dir->alte+1;
} else{
aux1->altd = aux1->dir->altd+1;
}
return aux1;
}

ARVORE* balanceamento(ARVORE *aux){
int d, df;
d= aux->altd - aux->alte;
if(d == 2){
df = aux->dir->altd - aux->dir->alte;
if (df>=0){
aux = rotacao_esquerda(aux);
} else{
aux->dir=rotacao_direita(aux->dir);
aux = rotacao_esquerda(aux);
}
} else if(d == -2){
df = aux->esq->altd - aux->esq->alte;
if(df <= 0){
aux = rotacao_direita(aux);
} else{
aux->esq = rotacao_esquerda(aux->esq);
aux = rotacao_direita(aux);
}
}
return aux;
}

ARVORE* inserir(ARVORE *aux, int num){
ARVORE *novo;
if(aux == NULL){
novo = new ARVORE();
novo->num = num;
novo->altd = 0;
novo->alte = 0;
novo->esq = NULL;
novo->dir = NULL;
aux = novo;
} else if(num < aux->num){
aux->esq = inserir(aux->esq, num);
if(aux->esq->altd > aux->esq->alte){
aux->alte = aux->esq->altd+1;
} else{
aux->alte = aux->esq->alte+1;
}

aux = balanceamento(aux);
} else{
aux->dir = inserir(aux->dir, num);
if(aux->dir->altd > aux->dir->alte){
aux->altd = aux->dir->altd+1;
} else{
aux->altd = aux->dir->alte+1;
}

aux = balanceamento(aux);
}
return aux;
}

ARVORE* desalocar(ARVORE* aux){
if(aux != NULL){
aux->esq = desalocar(aux->esq);
aux->dir = desalocar(aux->dir);
delete aux;
}
return NULL;
}

int main(void) {
ARVORE *raiz = NULL;
ARVORE *aux;
int op, achou, numero;
do{
std::cout << "\n1 - Inserir";
std::cout << "\n2 - Consultar";
std::cout << "\n3 - Mostrar os elementos da Árvore em ordem";
std::cout << "\n4 - Esvaziar";
std::cout << "\n0 - Sair";
std::cout << "\nDigite sua opcao: ";
std::cin >> op;
if(op < 0 || op > 5){
std::cout << "\nOpcao invalida!!!";
} else if(op == 1){

}else if(op == 2){

}else if(op == 3){

}else if(op == 4){

}
}while (op!= 0);
raiz = desalocar(raiz);
return 0;
}



  


2. Re: Dúvidas sobre rotação de árvores e (seta) -> [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/06/2017 - 18:57h

Com relação ao operador ->, ele existe para que você possa fazer acesso aos membros de uma estrutura indicada por um ponteiro, sem precisar derreferenciar a estrutura toda de uma vez.

struct item_t {
char nome[40];
char descricao[100];
unsigned quantidade;
double preco;
};

void imprime_item(struct item_t *p_item){
printf(
"Nome do item: %s\n"
" Descrição: %s\n"
" Preço unitário: R$%02.f\n"
" Quantidade em estoque: %u\n",
p-Item->nome, p_item->descricao,
p_item->preco, p_item->quantidade
);
}


A rigor, o operador -> não seria estritamente necessário. Você pode obter o mesmo efeito final usando derreferência do ponteiro, seguida do acesso ao campo do objeto derreferenciado.

if(p_item->preco != (*p_item).preco)
fprintf(stderr, "Essa situação é impossível, pois os dois lados são sinônimos. Esta mensagem nunca será impressa.\n");


Se as duas coisas são sinônimas, por que não suprimir o ->? Existe uma razão histórica, implicada pelo comportamento de versões muito antigas do C (veja https://stackoverflow.com/questions/13366083/why-does-the-arrow-operator-in-c-exist, que é uma explicação bem completa, por sinal).

Teoricamente, hoje já não seriam mais necessários dois operadores distintos em C, mas acaba que “a->b” consome um caráter a menos no arquivo, de duas a quatro teclas a menos na hora de digitar, e menos poluição visual na tela. Fora isso, em C++ existe uma outra vantagem, que é a de poder fazer sobrecarga do operador -> (o operador ., por outro lado, não pode ser sobrecarregado).


3. Re: Dúvidas sobre rotação de árvores e (seta) -> [RESOLVIDO]

Filipe Braz
FilipeBraz

(usa Arch Linux)

Enviado em 08/06/2017 - 21:38h

Ah sim, no caso então a seta é usada para acessar o membro de uma estrutura referenciada pelo ponteiro... Irei fazer os testes aqui, obrigado.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts