Buscar

ArvoreBinaria

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

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando