Anda di halaman 1dari 4

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

h> struct noh{ int valor; noh * esquerda; noh * direita; }; void inserir(noh * novo); void imprimir(); void imprimir_pre(noh *); void imprimir_pos(noh *); void imprimir_em(noh *); noh * buscar(noh * raiz, int chave); int excluir(noh * raiz, int chave); noh * raiz; int main(){ do{ noh * novo_noh = (noh *) malloc(sizeof(noh)); novo_noh->esquerda=NULL; novo_noh->direita=NULL; printf("Escreva o valor do novo n:"); scanf("%i",&(*novo_noh).valor); inserir(novo_noh); system("cls"); }while(getch() != 27); imprimir(); int chave; do{ system("cls"); printf("Escreva a chave de busca:"); scanf("%i",&chave); buscar(raiz, chave); }while(getch() != 27); do{ system("cls"); printf("Escreva a chave de excluso:"); scanf("%i",&chave); excluir(raiz, chave); imprimir(); }while(getch() != 27); } void inserir(noh * novo){ 1

if(raiz == NULL){ raiz=novo; }else{ noh * atual=raiz; noh * anterior; while(atual!=NULL){ anterior=atual; if((*novo).valor>(*atual).valor){ atual=atual->direita; }else if((*novo).valor<(*atual).valor){ atual=atual->esquerda; }else{ printf("Valor j cadastrado"); break; } } if((*novo).valor>(*anterior).valor){ anterior->direita=novo; }else if((*novo).valor<(*anterior).valor){ anterior->esquerda=novo; } } } void imprimir(){ printf("\n Arvore em pr-ordem:"); imprimir_pre(raiz); system("pause"); printf("\n Arvore em ps-ordem:"); imprimir_pos(raiz); system("pause"); printf("\n Arvore em em-ordem:"); imprimir_em(raiz); system("pause"); } void imprimir_pre(noh * atual){ if(atual != NULL){ printf("%i",(*atual).valor); imprimir_pre(atual->esquerda); imprimir_pre(atual->direita); } } void imprimir_pos(noh * atual){ if(atual != NULL){ imprimir_pos(atual->esquerda); imprimir_pos(atual->direita); printf("%i",(*atual).valor); } } void imprimir_em(noh * atual){ 2

if(atual != NULL){ imprimir_em(atual->esquerda); printf("%i",(*atual).valor); imprimir_em(atual->direita); } } noh * buscar(noh * raiz, int chave){ noh * atual=raiz; while(atual != NULL){ if(chave>(*atual).valor){ atual=atual->direita; } else if(chave<(*atual).valor){ atual=atual->esquerda; } else{ printf("Valor encontrado!"); return atual; } } printf("Valor no encontrado"); } int excluir(noh * raiz, int chave){ if(raiz == NULL){ printf("Arvore vazia!"); }else{ noh * atual=raiz; noh * anterior=atual; while(atual!=NULL){ anterior=atual; if(chave>(*atual).valor){ atual=atual->direita; }else if(chave<(*atual).valor){ atual=atual->esquerda; } if(chave==(*atual).valor){ //EXCLUSO DE N FOLHA if(atual->direita==NULL && atual->esquerda==NULL){ if(chave==(*raiz).valor){ raiz=NULL; printf("Folha, raiz"); }else{ printf("Folha, no raiz"); if(chave>(*anterior).valor) anterior->direita = NULL; if(chave<(*anterior).valor) anterior->esquerda = NULL; } //EXCLUSO DE N COM UMA LIGAO }else{ 3

if((atual->direita!=NULL && atual->esquerda==NULL) || (atual->direita==NULL && atual->esquerda!=NULL)){ printf("Uma ligao"); if(chave==(*raiz).valor){ printf(", raiz"); if(raiz->direita==NULL) raiz=raiz->esquerda; if(raiz->esquerda==NULL) raiz=raiz->direita; }else{ printf(", no raiz"); if(chave>(*anterior).valor){ if(atual->direita !=NULL) anterior->direita=atual>direita; if(atual->esquerda!=NULL) anterior->direita=atual>esquerda; } if(chave<(*anterior).valor){ if(atual->direita !=NULL) anterior->esquerda=atual>direita; if(atual->esquerda!=NULL) anterior>esquerda=atual->esquerda; } } }else{ //EXCLUSO DE N COM DUAS LIGAES if(atual->direita!=NULL && atual->esquerda!=NULL){ printf("com duas ligacoes"); if(chave==(*raiz).valor) raiz=raiz->direita; anterior->direita=atual->direita; noh * auxiliar = atual->direita; while(auxiliar->esquerda != NULL) auxiliar=auxiliar>esquerda; auxiliar->esquerda=atual->esquerda; } } } free(atual); system("pause"); return 1; } printf("Anterior %i", (*anterior).valor); } } }

Anda mungkin juga menyukai