Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
ArvoreBinaria.c #include <stdio.h> #include <stdlib.h> #include "ArvoreBinaria.h" struct No { struct No *left;/*ponteiro para esquerda*/ int info;/*dado da arvore*/ struct No *right;/*ponteiro para a direita*/ }; ArvBin* createArvBin() { ArvBin* raiz = (ArvBin*)malloc(sizeof(ArvBin)); if(raiz != NULL) { *raiz = NULL; } return raiz; } void freeNo(struct No* no) { if(no == NULL) return; freeNo(no->left); freeNo(no->right); free(no); no = NULL; } void freeArvBin(ArvBin* raiz) { if(raiz == NULL) return; freeNo(*raiz);/* *raiz = endereço do pai*/ free(raiz); } NoArv* createNo(int dado) { NoArv *no = (NoArv*)malloc(sizeof(NoArv)); if(no != NULL) { no->left = NULL; no->info = dado; no->right = NULL; } return no; } short insertArvBin(ArvBin* raiz, int dado) { if(raiz == NULL) return 0; if(*raiz == NULL) { *raiz = createNo(dado); return 1; } if(dado > (*raiz)->info) { insertArvBin(&((*raiz)->right), dado); } else if(dado < (*raiz)->info) { insertArvBin(&((*raiz)->left), dado); } return 1; } short removeArvBin(ArvBin* raiz, int dado) { if(raiz == NULL) return 0; NoArv* aux;//so mudar aqui if(dado < (*raiz)->info) { removeArvBin(&((*raiz)->left), dado); } if(dado > (*raiz)->info) { removeArvBin(&((*raiz)->right), dado); } if(dado == (*raiz)->info) { if(((*raiz)->left == NULL) && ((*raiz)->right == NULL)) { aux = minimo((*raiz)->right); (*raiz)->info = aux->info; removeArvBin(&((*raiz)->right), (*raiz)->info); } if(((*raiz)->left != NULL) || ((*raiz)->right != NULL)) { aux = *raiz; if(((*raiz)->left != NULL) && ((*raiz)->right == NULL)) { *raiz = (*raiz)->right; } if(((*raiz)->left == NULL) && ((*raiz)->right != NULL)) { *raiz = (*raiz)->left; } free(aux); } } return 1; } NoArv* minimo(NoArv* raiz) { if(raiz == NULL) { return NULL; } else if(raiz != NULL) { if(raiz->left == NULL) { return raiz; } else if(raiz->left != NULL) { return minimo(raiz->left); } } } int totalNosArvBin(ArvBin* raiz) { if(raiz == NULL) return 0; if(*raiz == NULL) return 0; int quantEsq = totalNosArvBin(&((*raiz)->left)); int quantDir = totalNosArvBin(&((*raiz)->right)); return (quantEsq + quantDir + 1); } short verificaExisteDado(NoArv* raiz, int dado) { if(raiz == NULL) return 0; if(dado == raiz->info) return 1; int x = verificaExisteDado(raiz->left, dado); int y = verificaExisteDado(raiz->right, dado); if((x || y) == 1) return 1; return 0; } void exibirEmPreOrdem(NoArv* raiz) { if(raiz == NULL) return; printf("%d ", raiz->info); exibirEmPreOrdem(raiz->left); exibirEmPreOrdem(raiz->right); } void exibirEmOrdem(NoArv* raiz)/*Recebe endereço do pai*/ { if(raiz == NULL) return; exibirEmOrdem(raiz->left); printf("%d ", raiz->info); exibirEmOrdem(raiz->right); } void exibirEmPosOrdem(NoArv* raiz) { if(raiz == NULL) return; exibirEmPosOrdem(raiz->left); exibirEmPosOrdem(raiz->right); printf("%d ", raiz->info); } ArvoreBinaria.h #ifndef ARVOREBINARIA_H_ #define ARVOREBINARIA_H_ typedef struct No NoArv; typedef struct No* ArvBin; ArvBin* createArvBin(); void freeArvBin(ArvBin* raiz); short insertArvBin(ArvBin* raiz, int dado); short removeArvBin(ArvBin* raiz, int dado); int totalNosArvBin(ArvBin* raiz); short verificaExisteDado(NoArv* raiz, int dado);/*Recebe Pt para o pai*/ void exibirEmPreOrdem(NoArv* raiz); void exibirEmOrdem(NoArv* raiz); void exibirEmPosOrdem(NoArv* raiz); /*Nesse caso o *pt e para o no pai*/ #endif
Compartilhar