Comente o codigo... #include #include#include struct carro{ char nome[30]; char marca[30]; int ano; float

Comente o codigo...
#include
#include#include

struct carro{
char nome[30];
char marca[30];
int ano;
float preco;
};

struct No{
int numero;
struct carro x;
struct No *esquerda;
struct No *direita;

};
typedef struct No No;

void criarArvore(No **pRaiz){
*pRaiz = NULL;
}

void inserir(No **pRaiz, int numero, struct carro x){
if(*pRaiz == NULL){
*pRaiz = (No *) malloc(sizeof(No));
(*pRaiz)->esquerda = NULL;
(*pRaiz)->direita = NULL;
(*pRaiz)->numero = numero;
(*pRaiz)->x = x;
}else{
if(numero < (*pRaiz)->numero)
inserir(&(*pRaiz)->esquerda, numero, x);
if(numero > (*pRaiz)->numero)
inserir(&(*pRaiz)->direita, numero, x);
}
}

No *MaiorDireita(No **no){
if((*no)->direita != NULL)
return MaiorDireita(&(*no)->direita );
else{
No *aux = *no;
if((*no)->esquerda != NULL) // se nao houver essa verificacao, esse nó vai perder todos os seus filhos da esquerda!
*no = (*no)->esquerda;
else
*no = NULL;
return aux;
}
}

No *MenorEsquerda(No **no){
if((*no)->esquerda != NULL)
return MenorEsquerda(&(*no)->esquer da);
else{
No *aux = *no;
if((*no)->direita != NULL) // se nao houver essa verificacao, esse nó vai perder todos os seus filhos da direita!
*no = (*no)->direita;
else
*no = NULL;
return aux;
}
}

void remover(No **pRaiz, int numero){
if(*pRaiz == NULL){ // esta verificacao serve para caso o numero nao exista na arvore.
printf(“Numero nao existe na arvore!”);
getch();
return;
}
if(numero < (*pRaiz)->numero)
remover(&(*pRaiz)->esquerda, numero);
else
if(numero > (*pRaiz)->numero)
remover(&(*pRaiz)->direita, numero);
else{ // se nao eh menor nem maior, logo, eh o numero que estou procurando!
No *pAux = *pRaiz; // quem programar no Embarcadero vai ter que declarar o pAux no inicio do void! :[
if (((*pRaiz)->esquerda == NULL) && ((*pRaiz)->direita == NULL)){ // se nao houver filhos…
free(pAux);
(*pRaiz) = NULL;
}
else{ // so tem o filho da direita
if ((*pRaiz)->esquerda == NULL){
(*pRaiz) = (*pRaiz)->direita;
pAux->direita = NULL;
free(pAux); pAux = NULL;
}
else{ //so tem filho da esquerda
if ((*pRaiz)->direita == NULL){
(*pRaiz) = (*pRaiz)->esquerda;
pAux->esquerda = NULL;
free(pAux); pAux = NULL;
}
else{ //Escolhi fazer o maior filho direito da subarvore esquerda.
pAux = MaiorDireita(&(*pRaiz)->esqu erda); //se vc quiser usar o Menor da esquerda, so o que mudaria seria isso:
pAux->esquerda = (*pRaiz)->esquerda; // pAux = MenorEsquerda(&(*pRaiz)->dir eita);
pAux->direita = (*pRaiz)->direita;
(*pRaiz)->esquerda = (*pRaiz)->direita = NULL;
free((*pRaiz)); *pRaiz = pAux; pAux = NULL;
}
}
}
}
}

void exibirEmOrdem(No **pRaiz){
if((*pRaiz) != NULL){
exibirEmOrdem(&(*pRaiz)->esq uerda);
printf(“ %i”, (*pRaiz)->numero);
exibirEmOrdem(&(*pRaiz)->dir eita);
}

}

void exibirPreOrdem(No **pRaiz){
if((*pRaiz) != NULL){
printf(“ %i”, (*pRaiz)->numero);
exibirPreOrdem(&(*pRaiz)->es querda);
exibirPreOrdem(&(*pRaiz)->di reita);
}
}

void exibirPosOrdem(No **pRaiz){
if((*pRaiz) != NULL){
exibirPosOrdem(&(*pRaiz)->es querda);
exibirPosOrdem(&(*pRaiz)->di reita);
printf(“ %i”, (*pRaiz)->numero);
}

}

int contarNos(No **pRaiz){
if((*pRaiz) == NULL)
return 0;
else
return 1 + contarNos(&(*pRaiz)->esquerd a) + contarNos(&(*pRaiz)->direita );
}

int contarFolhas(No **pRaiz){
if((*pRaiz) == NULL)
return 0;
if((*pRaiz)->esquerda == NULL && (*pRaiz)->direita == NULL)
return 1;
return contarFolhas(&(*pRaiz)->esqu erda) + contarFolhas(&(*pRaiz)->dire ita);
}

int maior(int a, int b){
if(a > b)
return a;
else
return b;
}

int altura(No **pRaiz){
if(((*pRaiz) == NULL) || ((*pRaiz)->esquerda == NULL && (*pRaiz)->direita == NULL))
return 0;
else
return 1 + maior(altura(&(*pRaiz)->esqu erda), altura(&(*pRaiz)->direita));
}

int main (){

struct carro ca;
int c;
No *pRaiz;
criarArvore(&pRaiz);
;
int op;
do{
printf(“ 1 — INSERIR CARRO: ”);
printf(“2 — REMOVER CARRO: ”);
printf(“3 — MOSTRAR CARROS EM ORDEM: ”);
printf(“4 — MOSTRAR CARROS EM PRE-ORDEM: ”);
printf(“5 — MOSTRA CARROS EM POS-ORDEM: ”);
printf(“6 — CONTAR NOS ”);
printf(“7 — CONTAR FOLHAS ”);
printf(“8 — ALTURA DA ARVORE ”);
printf(“9 — LIMPAR TELA ”);
printf(“0 — SAIR ”);
printf(“DIGITE UMA OPCAO: “);
scanf(“%d”, &op);
switch(op){
case 1:
printf(“ NOME: “);
scanf(“%s”, &ca. nome);
printf(“ MARCA: “);
scanf(“%s”,&ca. marca);
printf(“ PRECO DO CARRO: “);
scanf(“%f”, &ca. preco);
printf(“ DIGITE UM NUMERO: “);
scanf(“%d”,&c);

inserir(&pRaiz, c,ca);
break;
case 2:
printf(“ DIGITE UM NUMERO: “);
scanf(“%d”,&c);
remover(&pRaiz, c);
break;
case 3:
exibirEmOrdem(&pRaiz);
break;
case 4:
exibirPreOrdem(&pRaiz);
break;

case 5:
exibirPosOrdem(&pRaiz);
break;

case 6:
printf(“ CONTAR NOS: %d ”,contarNos(&pRaiz));
break;
case 7:
printf(“ CONTAR FOLHAS: %d ”,contarFolhas(&pRaiz));< br /> break;
case 8:
printf(“ ALTURA: %d ”,altura(&pRaiz));
break;

case 9:
system(“cls”);
break;
case 0:
break;

default:
printf(“Opção Invalida.”);
break;
}
}while(op!=0);

return 0;
}

RESPONDER

Yarawaneska está aguardando sua ajuda, Clique aqui para responder.